Получить входной текст с пользовательским видом без edittext android
Я создал customview. Всякий раз, когда пользователь дважды нажимает на представление, он должен отображать клавиатуру, и пользователь может нарисовать новый текст.
Держатель - это пользовательский вид, который расширяет представление. Но он показывает клавиатуру. Как получить текст?
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
Ответы
Ответ 1
Попробуйте создать edittext динамически и отправьте значение для просмотра. Вот моя лучшая альтернатива code.its.
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();
}
});
Ответ 2
Вот пользовательский FrameLayout
, который, когда вы нажимаете на него, показывает soft-keyboard
, и вы можете вводить любую вещь, и когда вы нажимаете клавишу ввода, он показывает текст тоста с тем, что вы набрали, я надеюсь, что это даст вы идете:
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;
}
}
Ответ 3
@Asthme: после проверки ссылки на Как захватить ввод мягкой клавиатуры в представлении?, чтобы сделать вид редактирования доступным для вас. Также необходимо сделать настраиваемое BaseInputConnection, чтобы сделать View редактируемым.
И возможное кодовое решение дается по ссылке ниже, которая имеет вход от Dianne Hackborne (Android Framework Engineer).
https://groups.google.com/forum/#!topic/android-developers/N0ITpZZ16Bw
Перейдите к последнему из этой ссылки, и вы найдете пользовательский BaseInputConnection, чтобы сделать View доступным для редактирования.
Я отправляю соответствующий код и скриншоты для примера кода:
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;
}
}
Поскольку это пользовательское представление, нам необходимо обеспечить реализацию setText.
public void setText(CharSequence text) {
mText = text;
requestLayout();
invalidate();
}
Ниже приведен полный код пользовательского представления, это отличается от вашей реализации (я оставляю 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;
}
}
}
Прикрепленный экран. Pic-1 до касания, UI - некоторый текст. Pic-2 - это когда пользовательский вид коснулся и текст получен с мягкой клавиатуры. ! [Pic-1 с исходным текстом в пользовательском представлении] [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
Ответ 4
проверьте эту ссылку
о
попробуйте это, он может работать:
imm.showSoftInput(view,0);
Ответ 5
попробуйте это
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
mSearchEditText.requestFocus();
imm.showSoftInput(mSearchEditText, InputMethodManager.SHOW_IMPLICIT);
Ответ 6
Вы можете переопределить onKeyUp(int keyCode, KeyEvent event)
в своей деятельности, а затем отправить информацию о ключе (keyCode
и/или event
) в ваше представление. Убедитесь, что у вас есть подходящий пользовательский метод для обработки кодов клавиш/событий в вашем представлении (позволяет называть его handleKeyEvent
здесь).
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
yourCustomView.handleKeyEvent(keyCode, event);
}
источник: https://groups.google.com/forum/#!topic/android-developers/0tQSZufLZTg
Ответ 7
Попробуйте это....
view.requestFocus();
view.setFocusableInTouchMode(true);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(InputEditText, InputMethodManager.SHOW_FORCED);
также проверьте это
Как показать мягкую клавиатуру, когда edittext сфокусирован
Ответ 8
Используйте текстовое окно. Seteditable (true) в текстовом режиме заставляет его вести себя как edittext. Таким образом, переключайтесь между seteditable (true) и seteditable (false) относительно того, когда вы хотите редактировать и когда хотите читать