Получить входной текст с пользовательским видом без 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

Ответ 8

Используйте текстовое окно. Seteditable (true) в текстовом режиме заставляет его вести себя как edittext. Таким образом, переключайтесь между seteditable (true) и seteditable (false) относительно того, когда вы хотите редактировать и когда хотите читать