2011-11-29 14 views
6

(कृपया ध्यान दें कि व्यवहार इस सवाल में वर्णित केवल कुछ और दूसरे से असंबद्ध लगने हम क्या कर रहे थे की वजह से दिखाई दिया। the accepted answer देखें।)बदलें कैसे SlidingDrawer ट्रैकबॉल या कर्सर का जवाब

हम एक साथ एक Android गतिविधि है और एक SlidingDrawerRelativeLayout के अंदर। जिस तरह से यह गतिविधि ट्रैकबॉल (या कर्सर कुंजी) को प्रतिसाद देती है वह अजीब है। फ्रिड ग्रिड व्यू में आइटमों के बीच स्थानांतरित हो जाएगा, लेकिन जब भी कर्सर ग्रिड व्यू की "आउट" दिशा में चलता है। (उदाहरण के लिए ऊपर जब ऊपर, बाएं सबसे पहले आइटम पर छोड़ दिया गया) स्लाइडिंग ड्रॉवर खुलता है या बंद हो जाता है। विशेष रूप से, फोकस ग्रिड व्यू में एक ही आइटम पर रहता है --- यह स्लाइडिंग ड्रॉवर पर नहीं जाता है।

ट्रैकबॉल के साथ यह विशेष रूप से भयानक है, क्योंकि आपके वास्तविक गंतव्य के पीछे ट्रैकबॉल कताई करने से स्लाइडिंग ड्रॉवर बार-बार खुलने और बंद हो जाएगा।

हमने पाया है कि हम पूरी तरह से onTrackballEvent() ओवरराइड करके ट्रैकबॉल को बंद कर सकते हैं। हम सामान्य रूप से ग्रिड व्यू पर ट्रैकबॉल और कर्सर काम करना पसंद करते हैं लेकिन स्लाइडिंग ड्रॉवर को खोलने या बंद करने का कारण नहीं बनते हैं। सिद्धांत रूप में हम ट्रैकबॉल को स्लाइडिंग ड्रॉवर की विभिन्न सामग्री पर ध्यान केंद्रित करने के लिए भी पसंद करेंगे।

कैसे?

उत्तर

0

जैसा सामने आया है, हम इस समस्या को मूर्खता की एक असंबंधित बिट की वजह से। हम MENUSlidingDrawer खोलने और बंद करने के लिए कुंजी चाहते थे। हमने इसे onPrepareOptionsMenu() ओवरराइड करके किया:

public boolean onPrepareOptionsMenu (Menu menu) { 
    slidingDrawer.animateToggle(); 
    return true; 
} 

यह ठीक काम करता है; लेकिन यह पता चला है कि जब मेनू खोला नहीं जा रहा है तो इसे बुलाया जा सकता है। विशेष रूप से, यदि ActivitysetDefaultKeyMode(DEFAULT_KEYS_SHORTCUT) का उपयोग करता है, तो एक अनचाहे कुंजी ईवेंट मेनू तक पहुंच जाएगा। इसमें स्क्रीन के किनारे से ट्रैकबॉल गति शामिल है।

वांछित व्यवहार प्राप्त करने के लिए कम गूंगा रास्ता

public boolean onKeyUp(int keyCode, KeyEvent event) { 
    if(keyCode==KeyEvent.KEYCODE_MENU) { 
     slidingDrawer.animateToggle(); 
    } 
    return super.onKeyUp(keyCode,event); 
} 

इस बीच है, तो हम ट्रैकबॉल SlidingDrawer भीतर ले जाने के लिए जब यह एक SlidingDrawer.OnDrawerOpenListener जो कहता है

slidingDrawer.getContent().requestFocus(); 
की स्थापना करके खुला है प्राप्त कर सकते हैं

अंत में यह

slidingDrawer.getHandle().setFocusable(false); 
3

आप GridView और SlidingDrawer का विस्तार और GridView के लिए onInterceptTouchEvent और onTouchEvent का रिवाज कार्यान्वयन का उपयोग कर कस्टम दृश्य और सिर्फ SlidingDrawer के लिए onInterceptTouchEvent के लिए एक कस्टम कार्यान्वयन बनाने पर विचार कर सकते हैं। आप एक कस्टम SlidingDrawer क्या ऐसे उपयोगकर्ता इंटरैक्शन अपने कस्टम GridView के लिए handle

पर शुरू किया जा सकता है पर निर्भर करता है लागू करने की आवश्यकता नहीं हो सकता है, यह एक इंटरफ़ेस शायद इस तरह परिभाषित दे:

public interface MyGridViewListener { 
    public boolean shouldPreventScroll(); 
} 

वापसी करता है, तो अपने कस्टम SlidingDrawer खोला है। GridView पर यह लौटाए जाने वाले मान का उपयोग यह निर्धारित करने के लिए किया जाएगा कि क्या कार्रवाई की जानी चाहिए (onInterceptTouchEvent और onTouchEvent विधियों के लिए)। तो जब SlidingDrawer खोला जाता है, तो GridView पर किए गए कार्यों SlidingDrawer पर कुछ भी ट्रिगर नहीं करेंगे।

गतिविधि:

MyGridView gridView = (MyGridView) findViewById(R.id.gridView); 
gridView.setMyGridViewListener(new MyGridViewListener() { 
    @Override 
    public boolean shouldPreventScroll() { 
     return slidingDrawer.isOpened(); 
    } 
}); 

MyCustomGridView: shouldIntercept बुलाया जाएगा जब भी कुछ स्पर्श/ट्रैक घटना GridView पर होता है।

private boolean shouldIntercept() { 
    boolean shouldIntercept = false; 
    if(myGridViewListener != null) { 
     shouldIntercept = myGridViewListener.shouldPreventScroll(); 
    } 
    return shouldIntercept; 
} 
@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
    return shouldIntercept() ? true : super.onInterceptTouchEvent(ev); 
} 
@Override 
public boolean onTouchEvent(MotionEvent ev) { 
    return shouldIntercept() ? true : super.onTouchEvent(ev); 
} 
@Override 
public boolean onTrackballEvent(MotionEvent event) { 
    return shouldIntercept() ? true : super.onTrackballEvent(event); 
} 
public MyGridViewListener getMyGridViewListener() { 
    return myGridViewListener; 
} 
public void setMyGridViewListener(
     MyGridViewListener myGridViewListener) { 
    this.myGridViewListener = myGridViewListener; 
} 

मुझे आशा है कि यह एक सही दिशा में बताते हैं या कम से कम

+0

उपयोगी विचारों को कॉल करने के लिए एक अच्छा विचार प्रतीत होता है। इसने मुझे कस्टम 'स्लाइडिंग ड्रावर' में 'ओपन()' को ओवरराइड करने का विचार दिया और एक स्टैक ट्रेस उत्सर्जित किया, जिससे स्वीकृत उत्तर में वर्णित समाधान का कारण बन गया। –

1

में मदद करता है जबकि एक कस्टम फिसलने दराज के साथ प्रयोग करना,

handle.layout(0, 0,0, 0); 
की तरह कुछ मैं कुछ अजीब मूल्य के लिए हैंडल के लेआउट सेट

संभाल करने के लिए गायब हो जाते हैं, लेकिन स्क्रीन अभी भी फिसलने दराज है, जो कि मैं क्या नहीं करना चाहता था खोलेगा की तरफ से एक उंगली खींच, तो मैं

handle.layout(10000, 10000, 10000, 10000); 
सेट

जो इसे देखने योग्य क्षेत्र के बाहर ले जाया गया और ड्रॉवर को स्क्रीन के किनारे से खींचकर मैन्युअल रूप से बाहर खींच लिया नहीं जा सका। स्रोत कोड को देखने के बाद, दराज की स्लाइडिंग को निर्धारित करने वाले हैंडल की टीएच स्थिति, हैंडल से छुटकारा पाएं और इसे आपकी समस्या का समाधान करना चाहिए।

आप को खोलने के लिए /()/animateClose() दराज फोन animateOpen बंद की जरूरत है

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