oreo - android update




اكتشاف عند رفض المستخدم لوحة المفاتيح الناعمة (6)

أنا أعرف طريقة للقيام بذلك. فئة فرعية في EditText وتنفيذها:

@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
  if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
    // Do your thing.
    return true;  // So it is not propagated.
  }
  return super.dispatchKeyEvent(event);
}

في ما يلي رابط حول كيفية استخدام طرق العرض المخصصة (عندما تكون الفئة الفرعية EditText): http://developer.android.com/guide/topics/ui/custom-components.html

لدي عنصر واجهة مستخدم EditText في طريقة العرض الخاصة بي. عندما يحدد المستخدم أداة EditText ، أقوم بعرض بعض التعليمات وتظهر لوحة المفاتيح الناعمة.

أستخدم OnEditorActionListener لاكتشاف متى قام المستخدم بإكمال إدخال النص وقمت بإغلاق لوحة المفاتيح وإخفاء التعليمات وتنفيذ بعض الإجراءات.

مشكلتي هي عندما يرفض المستخدم لوحة المفاتيح بالضغط على المفتاح BACK. نظام التشغيل يرفض لوحة المفاتيح ، ولكن تعليماتي (التي يجب إخفاؤها) لا تزال مرئية.

لقد حاولت تجاوز OnKeyDown ، ولكن يبدو أنه لا يتم استدعاؤه عند استخدام الزر BACK لإلغاء لوحة المفاتيح.

لقد حاولت إعداد OnKeyListener على عنصر واجهة تعامل المستخدم EditText ، ولكن لا يبدو أنه تم استدعاؤه.

كيف يمكنني اكتشاف متى يتم رفض لوحة المفاتيح الناعمة؟


باستخدام إجابة @ olivier_sdg ، ولكن تم تحويلها إلى Kotlin:

class KeyboardEditText : EditText {

    private var mOnImeBack: EditTextImeBackListener? = null

    constructor(context: Context) : super(context)
    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)

    override fun onKeyPreIme(keyCode: Int, event: KeyEvent): Boolean {
        if (event.keyCode == KeyEvent.KEYCODE_BACK && event.action == KeyEvent.ACTION_UP) {
            if (mOnImeBack != null)
                mOnImeBack!!.onImeBack(this, this.text.toString())
        }
        return super.dispatchKeyEvent(event)
    }

    fun setOnEditTextImeBackListener(listener: EditTextImeBackListener) {
        mOnImeBack = listener
    }

}

interface EditTextImeBackListener {
    fun onImeBack(ctrl: KeyboardEditText, text: String)
}

فقط قم بإنشاء فئة تمتد إلى Edittext واستخدام edittext في التعليمات البرمجية الخاصة بك ، يجب تجاوز الطريقة التالية فقط في edittext المخصصة:

@Override
 public boolean onKeyPreIme(int keyCode, KeyEvent event) {
 if (keyCode == KeyEvent.KEYCODE_BACK) {

    //Here it catch all back keys
    //Now you can do what you want.

} else if (keyCode == KeyEvent.KEYCODE_MENU) {
    // Eat the event
    return true;
}
return false;}

لقد قمت بإجراء تغيير طفيف على حل جاي عن طريق استدعاء super.onKeyPreIme ():

_e = new EditText(inflater.getContext()) {
@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
    if (event.getKeyCode() == KeyEvent.KEYCODE_BACK){
            cancelTextInput();
        }
        return super.onKeyPreIme(keyCode, event);
    }
};

حل رائع ، جاي ، +1!


وهنا حل مع المستمع الرئيسي. ليس لدي أي فكرة لماذا يعمل هذا ولكن OnKeyListener يعمل إذا كنت فقط تجاوز ONKeyPreIme بحت على EditText المخصصة الخاصة بك.

SomeClass.java

customEditText.setOnKeyListener((v, keyCode, event) -> {
            if(event.getAction() == KeyEvent.ACTION_DOWN) {
                switch (keyCode) {
                    case KeyEvent.KEYCODE_BACK:
                        getPresenter().onBackPressed();
                        break;
                }
            }
            return false;
        }); 

CustomEditText.java

@Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event) {
        return super.dispatchKeyEvent(event);
    }





android