2011-08-07 15 views
8

अद्यतनएंड्रॉइड बटन - कैसे सही पर ध्यान केंद्रित करने के लिए सेट करें और अभी भी क्लिक करें क्लिक करें पहले क्लिक पर क्लिक श्रोता?

मैं बटन शैली से दो फ़ोकस करने योग्य लाइनों को हटाने और ऑनक्लिक ईवेंट हैंडलर का उपयोग करके क्लिक समस्या हल हो जाती गए कॉल करने के लिए requestFocusFromTouch();

दुर्भाग्य से मैं एक ऐसा मुद्दा है के साथ छोड़ दिया हूँ requestFocusFromTouch () गलत बटन पर केंद्रित है। यह हमेशा पहले बटन पर केंद्रित नहीं होता है, जिस बटन को मैं विधि पर कॉल करता हूं। क्या यह एक एंड्रॉइड बग या अपेक्षित व्यवहार है और मैं आसपास के काम के लिए क्या कर सकता हूं?

कोड अब onClick ईवेंट

public void onClick(View v) { 
    switch (v.getId()) { 
      case R.id.btn_home: 
       Intent i = new Intent(this, QuizMenu.class); 
       startActivity(i); 
       v.requestFocusFromTouch(); 
      break; 
      case R.id.btn_support: 
       Intent i1 = new Intent(this, Support.class); 
       startActivity(i1); 
       v.requestFocusFromTouch(); 
       View btnSupport = findViewById(R.id.btn_support); 
       btnSupport.setSelected(true); 
       btnSupport.requestFocusFromTouch(); 
      break; 
      // More buttons go here (if any) ... 
    } 
} 

अद्यतन के अंत के लिए इस तरह दिखता है

मैं निम्नलिखित शैली है कि

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <style name="MnuBtnStyle"> 
     <item name="android:ellipsize">marquee</item> 
     <item name="android:scrollHorizontally">true</item> 
     <item name="android:focusable">true</item> 
     <item name="android:focusableInTouchMode">true</item> 
     <item name="android:singleLine">true</item> 
     <item name="android:layout_height">wrap_content</item> 
     <item name="android:layout_width">fill_parent</item> 
     <item name="android:layout_marginTop">1dip</item> 
     <item name="android:layout_marginBottom">1dip</item> 
     <item name="android:textSize">10dp</item> 
     <item name="android:layout_weight">1</item> 
     <item name="android:textColor">#00FF00</item> 
     <item name="android:typeface">monospace</item> 
    </style> 
</resources> 

मैं एक है एक Android बटन है क्लिक श्रोता पर जो इस

जैसा दिखता है

मैं बटन पर एक छवि है और चयनकर्ता इस

<?xml version="1.0" encoding="utf-8"?> 
<selector 
    xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true" 
     android:drawable="@drawable/ic_tab_home_pressed" /> <!-- pressed --> 
    <item android:state_focused="true" 
     android:drawable="@drawable/ic_tab_home_pressed" /> <!-- pressed --> 
    <item android:drawable="@drawable/ic_tab_home_unpressed" /> <!-- default/unchecked --> 
</selector> 

लेआउट बटन का उपयोग करता है की तरह लग रहा है और बटन लग रहा है इस

अन्य बटनों और इस लेआउट
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:orientation="horizontal" 
     android:id="@+id/top_menu_bar" 
     android:layout_marginTop="2dip" 
     android:padding="0dip" 
     android:background="@android:drawable/bottom_bar" 
     android:layout_alignParentTop="true" 
     android:gravity="top" 
     android:layout_height="@dimen/menu_bar_height" 
     android:layout_width="fill_parent"> 
     <Button 
      android:id="@+id/btn_home" 
      android:text="@string/btn_home" 
      android:drawableTop="@drawable/home_button" 
      style="@style/MnuBtnStyle" 
     /> 
... 

देखते हैं की तरह एक शीर्ष मेनू पट्टी के रूप में कार्य कर रहा है जिसे किसी भी लेआउट में शामिल किया गया है।

बटन के लिए ऑनक्लिक ईवेंट केवल फोकस करने योग्य लाइनों के कारण बटन के दूसरे क्लिक पर निकाल दिया जाता है।

 <item name="android:focusable">true</item> 
     <item name="android:focusableInTouchMode">true</item> 

पहली क्लिक सेट बटन पर ध्यान केंद्रित तो दूसरा क्लिक onClick ईवेंट श्रोता मैं इतना है कि पहले क्लिक सेट ध्यान केंद्रित एक साथ दो गठबंधन करने के लिए की जरूरत है आग और onClick ईवेंट श्रोता सक्रिय करता है। क्या यह किया जा सकता है?

अगर मैं दो फ़ोकस करने योग्य लाइनों बटन सामान्य रूप से व्यवहार करते हैं हटाने लेकिन मैं दिखाने के लिए कि बटन केंद्रित है चाहता हूँ और मैं बटन के अंदर स्क्रॉल पाठ कि <item name="android:ellipsize">marquee</item> मुझे

कोई भी विचार देता है बहुत सराहना

उत्तर

3

चाहते आपको OnFocusChangeListener का उपयोग करने की आवश्यकता हो सकती है और फिर जांचें कि स्क्रीन टच मोड में होने पर फ़ोकस ईवेंट हुआ था: यदि ऐसा हुआ तो यह उपयोगकर्ता क्लिक था, अन्यथा यह ट्रैकबॉल/ट्रैकपैड से था।

+0

ग्रेट विचार, धन्यवाद। बस isInTouchMode की जांच करने में सक्षम नहीं लगता है।मुझे संकलन त्रुटियां मिल रही हैं – jamesc

+0

मुझे आखिरकार सबकुछ मिल गया लेकिन समाधान में अवांछित प्रभाव पड़ा। मुझे लाखों क्लिक मिलते हैं! ऑनफोकस्डेंज घटना को लाखों बार बुलाया जाता है। मैं केवल एक बार गतिविधि शुरू करने के लिए कोड को कॉल करने के लिए एक ध्वज जोड़ सकता हूं लेकिन मुझे वास्तव में एक बेहतर समाधान की आवश्यकता है क्योंकि यह घटना प्रदर्शन शर्तों में काफी महंगा हो सकती है। कोई विचार? – jamesc

+0

वास्तव में नहीं: जैसा कि आपने देखा है कि समस्या यह है कि पहला स्पर्श इसे स्पर्श मोड में रखता है और इसे केंद्रित करता है। यदि यह फोकस करने योग्य नहीं था तो यह इसे टच मोड में रखेगा और तुरंत क्लिक करेगा, लेकिन फोकस आवश्यकता के लिए अतिरिक्त कदम की आवश्यकता होगी। आपको ध्वज की आवश्यकता हो सकती है। – Femi

4

आप onClick(View v) में इस तरह कर सकते हैं:

..... 
v.setFocusableInTouchMode(true); 
v.requestFocus(); 
v.setFocusableInTouchMode(false); 
.....//the others 

हां, तो v ध्यान केंद्रित हो जाता है और आप setFocusableInTouchMode(false) के माध्यम से onClick() में कुछ कर सकते हैं, यह पहला स्पर्श पर onClick स्वीकार कर सकते हैं।

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