2013-02-15 75 views
7

ज्यादातर परिस्थितियों में, मैं मुख्य घटनाओं को (बच्चे) दृश्य द्वारा संसाधित करना चाहता हूं जो वर्तमान में ध्यान केंद्रित कर रहा है, जो डिफ़ॉल्ट व्यवहार है, और यह भी है जो मैंने वर्तमान में लागू किया है।एंड्रॉइड में, क्या वे बच्चे के दृश्य तक पहुंचने से पहले विश्व स्तर पर एक इंटरसेप्ट कुंजी घटनाएं कर सकते हैं जो फोकस है?

हालांकि, कुछ बहुत ही विशिष्ट परिस्थितियों में, मैं अस्थायी रूप से सभी महत्वपूर्ण घटनाओं (विशेष रूप से उन लोगों को सामान्य रूप से बच्चों के विचारों से संभाला जाता है) को अस्थायी रूप से अवरुद्ध करना और संभालना चाहता हूं, या तो मेरी मूल गतिविधि में, कोई फर्क नहीं पड़ता, जब तक वे वैश्विक रूप से संसाधित होते हैं - मुझे वॉल्यूम +/- जैसे हार्डवेयर बटनों की परवाह नहीं है, क्योंकि इन्हें किसी भी बच्चे के विचारों में किसी भी तरह से संभाला नहीं जाता है)।

के लिए स्पर्श घटनाओं, हम onInterceptTouchEvent() है, जो एक ViewGroup के रूप में वे बच्चे विचारों को भेज दिया जाता है स्पर्श घटनाओं को देखने के, और बच्चे देखा गया उन घटनाओं (जब आवश्यक होने पर) की प्राप्ति ब्लॉक करने के लिए अनुमति देता है जिसके लिए वे अभीष्ट है।

दुर्भाग्य से, मुझे मुख्य घटनाओं के लिए InterceptTouchEvent() पर समान कुछ नहीं मिल रहा है। क्या मुझे कुछ स्पष्ट याद आ रही है, या क्या यह ओएस में वास्तविक असमानता है?

बेशक, मैं केवल हर गतिविधि के वर्तमान कुंजी ईवेंट हैंडलर कोड को सीधे मुख्य गतिविधि पर एक विधि को कॉल करने के लिए तार कर सकता हूं ताकि ईवेंट को संभालने के लिए, और उस गतिविधि-स्तरीय विधि को बुलियन यह इंगित करता है कि यह घटना को संभाला है या नहीं। फिर, बच्चे का दृश्य घटना को संभाल सकता है अगर केवल और यदि गतिविधि विधि को लागू किया गया था तो इसे संभाला नहीं गया था।

लेकिन मुझे उम्मीद है कि बच्चे के दृश्य के पदानुक्रम को "नीचे" यातायात को आसानी से रोकने के लिए एक क्लीनर तरीका है, जैसे इंटेरसेप्ट टचवेन्ट() स्पर्श घटनाओं के लिए करता है।

+1

ध्यान दें कि मुझे जवाब में भी रूचि है कि यह बताता है कि यह * नहीं किया जा सकता है। यदि सत्यापित है, तो ऐसा उत्तर भी स्वीकार किया जा सकता है। – Carl

+0

मुझे यह जानने के लिए भी उत्सुकता है कि यह क्षमता स्पर्श घटनाओं के लिए क्यों मौजूद होगी, लेकिन महत्वपूर्ण घटनाओं के लिए नहीं, अगर वास्तव में यह मामला है। – Carl

उत्तर

0

सभी विजेट/दृश्य KeyEvent.Callback लागू करने लगते हैं, जिनमें कुंजी नीचे, लंबी प्रेस, एकाधिक और कुंजी के लिए कॉल करने के तरीके हैं। इन सभी विधियों में बुलियन मूल्यों को वापस समझाया गया है:

यदि आपने ईवेंट को संभाला है, तो सत्य वापस आएं। यदि आप अगले रिसीवर द्वारा संभाले जाने वाले ईवेंट को अनुमति देना चाहते हैं, तो झूठी वापसी करें।

मुझे लगता है कि आप इन तरीकों को मूल घटकों में ओवरराइड करने का प्रयास कर सकते हैं।

दूसरा dispatchKeyEvent()View है, यह फोकस पथ के नीचे घटनाओं को प्रेषित करता है। इसे ओवरराइड करने का भी प्रयास किया जा सकता है।

+0

आपके उत्तर के लिए धन्यवाद। 1) जब तक कि मैं गलत नहीं हूं, KeyEvent.Callback इंटरफ़ेस द्वारा घोषित विधियों, जैसे कि KeyDown(), को वर्तमान में ध्यान केंद्रित करने वाले दृश्य के लिए पहले बुलाया जाता है। यह केवल तभी होता है जब वह दृश्य इन तरीकों में से किसी एक से झूठा लौटाता है, अन्य, पूर्वजों, विचारों पर एक शॉट मिलता है। मुझे रूचि रखने वाले दृश्य से पहले रूट व्यू (या गतिविधि) घटनाओं तक पहुंच प्राप्त करने में दिलचस्पी है। 2) मेरा मानना ​​है कि प्रेषणकेयवेन्ट() * प्रोग्रामेटिक रूप से एक महत्वपूर्ण कार्यक्रम उत्पन्न करता है। मैं जो करने की कोशिश कर रहा हूं वह है * इंटरसेप्ट * * उपयोगकर्ता * के परिणामस्वरूप जेनरेट की गई एक घटना कुंजीपटल कुंजी टैप कर रही है। – Carl

+0

मैं देखता हूं। फोकस पकड़ने और पकड़ने के बारे में कैसे? –

+0

हम्म, हां, मैं देख सकता हूं कि एक ही समस्या का सामना करने वाले कुछ लोगों को प्रश्न में बच्चे के विचारों के लिए सेट फोकसबल (झूठा) कहने का दृष्टिकोण मिल सकता है, यदि आपके मन में यह है। मेरे लिए यह समस्या यह है कि मैं चाहता हूं कि उपयोगकर्ता चुनने और नेविगेट करने के लिए उन विचारों में स्पर्श का उपयोग जारी रख सके। मैं बस उन बच्चों के विचारों से कीबोर्ड इनपुट प्रोसेसिंग को अक्षम करना चाहता हूं, और इसे उसी कीस्ट्रोक की वैश्विक प्रसंस्करण के साथ प्रतिस्थापित करना चाहता हूं, जब कुछ स्थितियों का पता लगाया जाता है (वैश्विक स्तर पर)। – Carl

0

dispatchKeyEventViewGroup में ओवरराइडिंग View एस को अक्षम कार्यों के लिए पूर्वज है।

मैं निम्नलिखित का उपयोग कर रहा हूं ~।

public static class TvPrefsContainer extends FrameLayout { 
    private boolean isActive; // i.e. will dispatch keyboard events to focused children 
    // snip 

    @Override public boolean dispatchKeyEvent(KeyEvent event) { 
     return isActive && super.dispatchKeyEvent(event); 
    } 
} 

public static class TvPrefs extends PreferenceFragment { 
    @Override public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     addPreferencesFromResource(R.xml.tv_prefs); 
    } 
} 

private void togglePrefsVis() { 
    tvPrefsContainer.animate() 
      .alpha(isPrefsVisible ? 0 : 1) 
      .translationX(isPrefsVisible ? tvPrefsContainer.getMeasuredWidth() : 0) 
      .start(); 
    tvPrefsContainer.isActive = isPrefsVisible; 
    isPrefsVisible = !isPrefsVisible; 
} 
+0

मैं 'iscted' के बारे में गलत हूं। कम से कम यह राज्य सूची ड्रायबल्स – nmr

+0

के लिए उपयोग किए जाने वाले राज्यों में योगदान देता है, मुझे लगता है कि प्रेषणकेएवेन्टप्रिइम (http://developer.android.com/reference/android/view/ViewGroup.html#dispatchKeyEventPreIme(android.view.KeyEvent)) अधिक उपयोगी होगा – Grimmy

0

आप अपने रूट व्यू में OnGlobalFocusChangeListener जोड़ सकते हैं। के ऐसा गतिविधि प्रति दो:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    findViewById(android.R.id.content).getViewTreeObserver().addOnGlobalFocusChangeListener(new ViewTreeObserver.OnGlobalFocusChangeListener() { 
     @Override 
     public void onGlobalFocusChanged(View oldFocus, View newFocus) { 
      if (newFocus instanceof EditText) { 
       ((EditText) newFocus).addTextChangedListener(new TextWatcher() { 
        @Override 
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { 
         //process whatever you want 
        } 

        @Override 
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 
        } 

        @Override 
        public void afterTextChanged(Editable editable) { 
        } 
       }); 
      } 
     } 
    }); 
} 
बेशक

अगर आप EditText के अलावा अन्य विचारों आप यह पता लगाने के लिए अपने परिवर्तन निरीक्षण करने के लिए कैसे है में रुचि रखते हैं।

साथ ही यदि आप अपनी सभी गतिविधियों में वैश्विक स्तर पर इसे जोड़ना चाहते हैं तो Application#registerActivityLifecycleCallbacks() का उपयोग अपनी सभी गतिविधियों में उस कोड का उपयोग करने के लिए करें।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^