studio - Obtener texto de entrada con vista personalizada sin edittext android
plain text android studio (8)
Puede anular onKeyUp(int keyCode, KeyEvent event)
en su actividad y luego enviar la información clave ( keyCode
y / o event
) a su vista. Asegúrese de tener un método personalizado adecuado para manejar códigos / eventos clave en su vista (vamos a llamarlo handleKeyEvent
aquí).
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
yourCustomView.handleKeyEvent(keyCode, event);
}
fuente: https://groups.google.com/forum/#!topic/android-developers/0tQSZufLZTg
Creé una vista personalizada Cada vez que el usuario toca dos veces en la vista, debe mostrar el teclado y el usuario puede dibujar un nuevo texto.
Holder es una vista personalizada que extiende la vista. Pero muestra el teclado. Cómo obtener el texto?
public Holder(Context context, AttributeSet attrs) {
super(context, attrs);
Log.e(TAG,"EXE");
imm = (InputMethodManager)
context. getSystemService(Context.INPUT_METHOD_SERVICE);
public boolean onDoubleTap(MotionEvent e) {
View view = Holder.this.getRootView();
imm.showSoftInput(view, InputMethodManager.SHOW_FORCED);
// imm.showSoftInput(Holder.this, InputMethodManager.SHOW_FORCED); not working
prueba esto
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
mSearchEditText.requestFocus();
imm.showSoftInput(mSearchEditText, InputMethodManager.SHOW_IMPLICIT);
revise este enlace o intente esto, puede funcionar:
imm.showSoftInput(view,0);
Aquí está un FrameLayout
personalizado que cuando hace clic en él, muestra soft-keyboard
FrameLayout
y puede escribir cualquier cosa y cuando presiona la soft-keyboard
Enter, muestra un texto tostado con lo que ha escrito, espero que le dé la idea:
public class MyCustomFrameLayout extends FrameLayout {
String mText;
public MyCustomFrameLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public MyCustomFrameLayout(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public MyCustomFrameLayout(Context context) {
super(context);
init();
}
@Override
public boolean onCheckIsTextEditor() {
return true;
}
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
BaseInputConnection fic = new BaseInputConnection(this, false);
outAttrs.actionLabel = null;
outAttrs.inputType = InputType.TYPE_NULL;
outAttrs.imeOptions = EditorInfo.IME_ACTION_DONE;
return fic;
}
public void init(){
setFocusable(true);
setFocusableInTouchMode(true);
mText ="";
setOnKeyListener(new OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
if((keyCode >= KeyEvent.KEYCODE_A) && (keyCode <= KeyEvent.KEYCODE_Z)) {
mText = mText + (char) event.getUnicodeChar();
return true;
}
else if(keyCode >= KeyEvent.KEYCODE_ENTER){
Toast.makeText(getContext(), "The text is: " + mText , Toast.LENGTH_LONG).show();
return true;
}
}
return false;
}
});
}
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
if (event.getAction() == MotionEvent.ACTION_DOWN) {
InputMethodManager imm = (InputMethodManager) getContext()
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(this, InputMethodManager.SHOW_FORCED);
}
return true;
}
public String getText(){
return mText;
}
}
Intenta crear el texto de edición de forma dinámica y envía el valor para ver. Aquí está mi código. Es la mejor alternativa.
public class CustomEditText extends EditText {
private KeyImeChange keyImeChangeListener;
public CustomEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public CustomEditText(Context context) {
super(context);
}
public CustomEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setKeyImeChangeListener(KeyImeChange listener){
keyImeChangeListener = listener;
}
public interface KeyImeChange {
public void onKeyIme(int keyCode, KeyEvent event);
}
@Override
public boolean onKeyPreIme (int keyCode, KeyEvent event){
if(keyImeChangeListener != null){
keyImeChangeListener.onKeyIme(keyCode, event);
}
return false;
}
}
MainActivity.editText2.setKeyImeChangeListener(new CustomEditText.KeyImeChange() {
@Override
public void onKeyIme(int keyCode, KeyEvent event) {
//Update view on keyboard close
invalidate();
}
});
Use una vista de texto en sí. Seteditable (verdadero) en una vista de texto hace que se comporte como un texto de edición. Así que alternar entre seteditable (verdadero) y seteable (falso) en cuanto a cuándo desea editar y cuándo desea leer
@Asthme: ¿Después de verificar el enlace en Cómo capturar la entrada del teclado virtual en una Vista? Para que una Vista sea editable, también necesita crear BaseInputConnection personalizado para hacer que la Vista sea editable.
Y la solución de código posible se proporciona en el siguiente enlace que cuenta con la opinión de Dianne Hackborne (Android Framework Engineer).
https://groups.google.com/forum/#!topic/android-developers/N0ITpZZ16Bw
Vaya hasta el final de este enlace y encontrará BaseInputConnection personalizada para hacer que la Vista sea editable.
Estoy publicando código relevante y capturas de pantalla para el código de muestra:
class MyInputConnection extends BaseInputConnection {
private SpannableStringBuilder myeditable;
Holder mycustomview;
public MyInputConnection(View targetView, boolean fullEditor) {
super(targetView, fullEditor);
mycustomview = (Holder) targetView;
}
public Editable getEditable() {
if (myeditable == null) {
myeditable = (SpannableStringBuilder) Editable.Factory.getInstance()
.newEditable("Placeholder");
}
return myeditable;
}
public boolean commitText(CharSequence text, int newCursorPosition) {
invalidate();
myeditable.append(text);
mycustomview.setText(text);
return true;
}
}
Como se trata de una vista personalizada, debemos proporcionar la implementación de setText.
public void setText(CharSequence text) {
mText = text;
requestLayout();
invalidate();
}
A continuación se muestra el código de vista personalizado completo, esto difiere de su implementación (estoy dejando Gesture * API Unimplemented)
package com.example.soappdemo;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.text.Editable;
import android.text.InputType;
import android.text.SpannableStringBuilder;
import android.util.AttributeSet;
import android.util.Log;
import android.view.GestureDetector;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.inputmethod.BaseInputConnection;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
import android.view.inputmethod.InputMethodManager;
import android.widget.TextView;
public class Holder extends View implements GestureDetector.OnDoubleTapListener {
InputMethodManager imm;
private Paint paint;
private static final String TAG="Holder";
private CharSequence mText="original";
public Holder(Context context, AttributeSet attrs) {
super(context, attrs);
init();
//requestFocus();
setFocusableInTouchMode(true);
setFocusable(true);
requestFocus();
setOnKeyListener(new OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
Log.d(TAG, "onKeyListener");
if (event.getAction() == KeyEvent.ACTION_DOWN) {
// Perform action on key press
Log.d(TAG, "ACTION_DOWN");
return true;
}
return false;
}
});
}
public void init(){
paint = new Paint();
paint.setTextSize(12);
paint.setColor(0xFF668800);
paint.setStyle(Paint.Style.FILL);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawText(mText.toString(), 100, 100, paint);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
this.setMeasuredDimension(150,200);
}
public void setText(CharSequence text) {
mText = text;
requestLayout();
invalidate();
}
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
Log.d(TAG, "onTOUCH");
if (event.getAction() == MotionEvent.ACTION_UP) {
// show the keyboard so we can enter text
InputMethodManager imm = (InputMethodManager) getContext()
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(this,0);
}
return true;
}
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
Log.d(TAG, "onCreateInputConnection");
outAttrs.actionLabel = null;
outAttrs.label="TEST TEXT";
outAttrs.inputType = InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS;
outAttrs.imeOptions = EditorInfo.IME_ACTION_DONE;
return new MyInputConnection(this,true);
}
@Override
public boolean onCheckIsTextEditor() {
Log.d(TAG, "onCheckIsTextEditor");
return true;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
// TODO Auto-generated method stub
View view = Holder.this.getRootView();
imm.showSoftInput(view, InputMethodManager.SHOW_FORCED);
return false;
}
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
class MyInputConnection extends BaseInputConnection {
private SpannableStringBuilder myeditable;
Holder mycustomview;
public MyInputConnection(View targetView, boolean fullEditor) {
super(targetView, fullEditor);
mycustomview = (Holder) targetView;
}
public Editable getEditable() {
if (myeditable == null) {
myeditable = (SpannableStringBuilder) Editable.Factory.getInstance()
.newEditable("Placeholder");
}
return myeditable;
}
public boolean commitText(CharSequence text, int newCursorPosition) {
invalidate();
myeditable.append(text);
mycustomview.setText(text);
return true;
}
}
}
Adjunto está la captura de pantalla. Pic-1 es antes del tacto, la IU es algo de texto. Pic-2 es cuando se toca la vista personalizada y se recibe el texto del teclado virtual. ! [Pic-1, con texto inicial en vista personalizada] [1]
![Pic-2 when custom view is tapped][2]
[1]: http://i.stack.imgur.com/rLYmR.png
[2]: http://i.stack.imgur.com/gTnYY.png
Prueba esto....
view.requestFocus();
view.setFocusableInTouchMode(true);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(InputEditText, InputMethodManager.SHOW_FORCED);
también verifique esto
Cómo mostrar el teclado virtual cuando el texto de edición está enfocado