style studio solo propiedades plain obtener letras eventos edittext datos android canvas android-input-method

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