2014-12-31 4 views
14

Я создал customview. Когда пользователь дважды нажимает на представление, он должен отображать клавиатуру, и пользователь может нарисовать новый текст.Получить текст ввода с пользовательским видом без edittext android

Держатель - это пользовательский вид, который расширяет вид. Но он показывает клавиатуру. Как получить текст?

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 

ответ

6

Попытка создать EditText динамически и отправить значение view.Here мои 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(); 


       } 
      }); 
1

проверить это link о попробовать это может работать:

imm.showSoftInput(view,0); 
+2

после вызова keyborad, как я получу текст – Asthme

1

попробовать это

InputMethodManager imm = (InputMethodManager)  getSystemService(Context.INPUT_METHOD_SERVICE); 
mSearchEditText.requestFocus(); 
imm.showSoftInput(mSearchEditText, InputMethodManager.SHOW_IMPLICIT); 
0

Попробуйте это ....

view.requestFocus(); 
view.setFocusableInTouchMode(true); 
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
imm.showSoftInput(InputEditText, InputMethodManager.SHOW_FORCED); 

также проверить Тхи s

How to show soft-keyboard when edittext is focused

+1

@MS Gadaj после вызова keyborad, как я получу текст – Asthme

+0

sry im not gettin u? –

+0

он откроет клавиатуру, когда я удвожу tap.thats отлично после того, как пользователь добавит текст правильно? Как мне получить текст? – Asthme

4

Вот обычай 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; 
    } 
} 
+0

будет ли он показывать при наборе текста? – Asthme

+0

Нет, но вы можете сделать это легко, после того как каждый вызов по нижнему ключу недействителен, а в методе onDraw напишите mText. – mmlooloo

+0

Я расширяю вид .i добавил этот код. Клавиатура не меняется на Ime. Действие выполнено. – Asthme

1

Вы можете переопределить 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

2

@Asthme: После проверки ссылку на How to Capture soft keyboard input in a View?, для того, чтобы в целях редактирования вы также должны сделать пользовательские BaseInputConnection сделать View для редактирования.

И возможное кодовое решение дается по ссылке ниже, на которую вводит Dianne Hackborne (Android Framework Engineer).

https://groups.google.com/forum/#!topic/android-developers/N0ITpZZ16Bw

Go до последнего из этой ссылки, и вы найдете пользовательские 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(); 
      } 

Ниже приведен полный код пользовательского зрения, это отличается от вашей реализации (я уезжаю Жест * API Не используется)

 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 
0

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

Смежные вопросы