OnKey () को दो बार क्यों कहा जाता है?


85

मैं इस कोड का उपयोग कर रहा हूं:

public boolean onKey(View v, int keyCode, KeyEvent event) {
msg = (EditText)findViewById(R.id.msg);
String message = msg.getText().toString();
            if(keyCode == 66)
            {
                //It's hitting here twice.          
            }
            return false;
        };

क्या कोई मुझे बता सकता है कि जब मैं प्रवेश करता हूं तो यह दो बार क्यों मार रहा है?


18
एक बार नीचे, एक बार ऊपर? OnKeyDown () या onKeyUp (), या KeyEvent.getAction () की जाँच करें।
— बेन्वाड

जवाबों:


209

OnKey को दो बार निकाल दिया जाता है: पहली बार कुंजी डाउन के लिए, और दूसरी बार कुंजी के लिए, इसलिए आपको फ़िल्टर करना होगा:

YOUR_VIEW.setOnKeyListener(new OnKeyListener()
        {                           
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {

                //This is the filter
                if (event.getAction()!=KeyEvent.ACTION_DOWN)
                    return true;

                switch (keyCode) {
                case KeyEvent.KEYCODE_1 : 
                    MakeToast(1);
                    break;
                case KeyEvent.KEYCODE_2 : 
                    MakeToast(2);
                    break;
                case KeyEvent.KEYCODE_3 : 
                    MakeToast(3);
                    break;

                }

                return true;
            }

        });

2
क्या सच्ची या झूठी वापसी का सुपर क्लास से कोई मतलब है?
— OrhanC1

6
आपको उन कुंजियों पर गलत लौटना चाहिए जो संसाधित नहीं हैं?
— यस्टेन

2
जाहिरा तौर पर यह return falseसंसाधित नहीं होने वाली कुंजियों के लिए होना चाहिए । मैंने इस कोड को डाला और जब EditTextमेरे ऐप ने बैक बटन पर जवाब देना बंद कर दिया ...
— luiges90

ऐसा करने से कीनवेंट dpad_center सुनना बंद हो जाएगा क्योंकि
— A_rmas

के लिए धन्यवाद event.getAction()!=KeyEvent.ACTION_DOWN, लेकिन मैं falseइस मामले में लौटता हूं । यदि true, किसी अन्य कुंजी का उपभोग किया जाएगा। तुम भी वापस बटन के साथ अपनी गतिविधि / टुकड़ा बाहर नहीं होगा!
— कूलमाइंड

1
 itemView.setOnKeyListener(new View.OnKeyListener() {
  @Override
  public boolean onKey(View v, int keyCode, KeyEvent event) {
    int pos = getAdapterPosition();
    if (event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_MENU){
     //code here
    }
    return false;
  }
 });

0
edittext.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View view, int i, KeyEvent keyEvent) {
            if (keyEvent.getAction() == KeyEvent.ACTION_DOWN || keyEvent.getAction() == KeyEvent.ACTION_UP) {
                switch (i) {
                    case KeyEvent.KEYCODE_ENTER:
                        if (!HelperFunction.isStringEmpty(edittext.getText().toString())) {

                            if (loadCount == 0) {

                                loadCount ++;


                            }
                        }
                    default:
                        return false;
                }
            }
            return false;
        }

यह कोड ब्लॉक दो बार कोड को कॉल करने से रोकता है। मैं लोडकाउंट स्ट्रिंग मान का उपयोग करता हूं, अगर लोडकाउंट == 0 मेरा कोड ब्लॉक चलाएं और मैं लोड कर रहा हूं यदि मेरे ब्लॉक में लोड करें ++। इसलिए समय पर मेरा कोड ब्लॉक काम करता है।


अपने कोड क्या करता है और यह कैसे समस्या हल करती है की व्याख्या प्रदान करने पर विचार करें।
— अंकित
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.