Android key event for back key when soft keyboard is shown?

前端 未结 3 695
别那么骄傲
别那么骄傲 2021-01-02 04:35

I am trying to capture the \"back\" key event when the soft keyboard is shown.

I am using SDK ver 8 and can successfully capture the back key event ONLY when the sof

相关标签:
3条回答
  • 2021-01-02 04:37

    Usually the back button will hide the keyboard (nateve behaivor), so it is not a good idea to do anything with that

    0 讨论(0)
  • 2021-01-02 04:52

    After digging around further on this site and the Android API I have found that

    KeyEvent.KEYCODE_BACK
    

    is caught and gobbled up by an IME that has an input method connection and that input method is currently shown (in other words; the soft keyboard is NOT hidden). This means that the event is consumed before the system calls the Activity classes onKeyDown() or onKeyUp() methods.

    To get around this, create a sub-class of your IME widget (TextView or its child classes such as EditText) and implement onKeyPreIme().

    Stack user i2097i has posted a good solution to implementing onKeyPreIme() in an activity here. Just make sure to return FALSE in your onKeyPreIme() Override if you wish to retain Androids default behaviour (i.e. closing the keyboard).

    0 讨论(0)
  • 2021-01-02 04:57

    Here is the way to capture back press key event: 1. Extend editText view to override onKeyPreIme

    package com.test.test;
    import android.content.Context;
    import android.util.AttributeSet;
    import android.view.KeyEvent;
    import android.widget.EditText;
    
    /**
     * Created by sumit.saurabh on 11/10/16.
     */
    public class ChatEditText extends EditText
    {
        /* Must use this constructor in order for the layout files to instantiate the class properly */
        public ChatEditText(Context context, AttributeSet attrs)
        {
            super(context, attrs);
            // TODO Auto-generated constructor stub
        }
    
        private KeyImeChange keyImeChangeListener;
    
        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;
        }
    }
    
    1. ChatEditText in xml

          <com.test.test.ChatEditText
              android:id = "@+id/messageEditText"
              android:layout_width = "match_parent"
              android:layout_height = "wrap_content"
              android:layout_gravity = "bottom"
              android:layout_marginLeft = "12dp"
              android:layout_marginRight = "30dp"
              android:background = "@null"
              android:hint = "Type your message"
              android:inputType = "textMultiLine"
              android:singleLine = "false"
              android:textColorHint = "#c4c0bd"
              android:textSize = "18sp"/>
      
    2. Then attach a listener (setKeyImeChangeListener) to the edit text:

      private ChatEditText messageEditText;
      messageEditText =
         (ChatEditText) findViewById(R.id.messageEditText);
      
      messageEditText.setKeyImeChangeListener(new ChatEditText.KeyImeChange(){
          @Override
          public void onKeyIme(int keyCode, KeyEvent event)
          {
              if (KeyEvent.KEYCODE_BACK == event.getKeyCode())
              {
                  // do something
              }
          }});
      
    0 讨论(0)
提交回复
热议问题