2009-05-04 12 views
23

मैं प्रत्येक गतिविधि के लिए अपने आवेदन में एक कस्टम शीर्षक दृश्य का उपयोग कर रहा हूं। बटन क्लिक के आधार पर, गतिविधियों में से एक में मुझे कस्टम शीर्षक दृश्य बदलने की आवश्यकता है। अब जब मैं setFeatureInt सेट करने के लिए कॉल करता हूं तो यह ठीक काम करता है।एंड्रॉइड - रन टाइम पर कस्टम शीर्षक दृश्य बदलें

लेकिन यदि मैं कस्टम शीर्षक में किसी भी आइटम को अपडेट करने का प्रयास करता हूं (कहें बटन के टेक्स्ट को बदलें या शीर्षक पर टेक्स्ट व्यू को बदलें), तो अपडेट नहीं होता है।

कोड के माध्यम से डीबगिंग से पता चलता है कि टेक्स्ट व्यू और बटन इंस्टेंस शून्य नहीं हैं और मैं कस्टम टाइटल बार भी देख सकता हूं। लेकिन टेक्स्ट व्यू या बटन पर टेक्स्ट अपडेट नहीं किया गया है। क्या किसी और को इस समस्या का सामना करना पड़ा है? मैं इसे कैसे हल करूं?

धन्यवाद।

संपादित

यहाँ मैं क्या करने की कोशिश की है। PostInvalidate को कॉल करने पर भी अपडेट नहीं किया जाता है।

getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.text_title); 

    TextView databar = (TextView) findViewById(R.id.title_text); 
    databar.setText("Some Text"); 
    databar.postInvalidate(); 

    Button leftButton = (Button) findViewById(R.id.left_btn); 
    leftButton.setOnClickListener(mLeftListener); 
    leftButton.setText("Left Btn"); 
    leftButton.postInvalidate(); 

    Button rightBtn = (Button) findViewById(R.id.right_btn); 
    rightBtn.setOnClickListener(mRightListener); 
    rightBtn.postInvalidate(); 
+0

वैकल्पिक समाधान के लिए इसे देखें http://stackoverflow.com/questions/8634319/how-to-set-different-title-for-alert-dialog-when-webview-page-is-loaded/9394561#9394561 – Sameer

उत्तर

30

समस्या केवल Window कार्यान्वयन (PhoneWindow) ने अपने setFeatureInt विधि में एक LayoutInflater उपयोग करता है और inflate और attachToRoot=true साथ नए लेआउट को दर्शाता है। नतीजतन, जब आप setFeatureInt पर कॉल करते हैं, तो नए लेआउट को प्रतिस्थापित नहीं करते हैं, लेकिन आंतरिक शीर्षक कंटेनर में संलग्न होते हैं और इस प्रकार एक दूसरे के शीर्ष पर खींचे जाते हैं।

आप setFeatureInt के बजाय निम्न सहायक विधि का उपयोग कर इसे हल कर सकते हैं। पहले नए कस्टम शीर्षक सुविधा सेट कर दिया जाता सहायक बस आंतरिक शीर्षक कंटेनर से सभी दृश्य को निकालकर:


private void setCustomTitleFeatureInt(int value) { 
    try { 
     // retrieve value for com.android.internal.R.id.title_container(=0x1020149) 
     int titleContainerId = (Integer) Class.forName(
      "com.android.internal.R$id").getField("title_container").get(null); 

     // remove all views from titleContainer 
     ((ViewGroup) getWindow().findViewById(titleContainerId)).removeAllViews(); 

     // add new custom title view 
     getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, value); 

    } catch(Exception ex) { 
     // whatever you want to do here.. 
    } 
} 

मुझे यकीन है कि क्या वर्तमान setFeatureInt व्यवहार करना है नहीं कर रहा हूँ, लेकिन यह निश्चित रूप एक ही रास्ता या दस्तावेज नहीं है अन्य जिसके कारण मैं एंड्रॉयड devs को यह ले लेंगे;)

संपादित

के रूप में टिप्पणी में कहा, ऊपर उल्लिखित वैकल्पिक हल आदर्श नहीं है। com.android.internal.R.id.title_container निरंतर पर भरोसा करने के बजाय आप छुपा सकते हैं जब भी आप एक नया सेट करते हैं तो पुराना कस्टम शीर्षक।

कि आप दो कस्टम शीर्षक लेआउट है मान लेते हैं:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout android:id="@+id/custom_title_1" ... 

और

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout android:id="@+id/custom_title_2" ... 

और आप custom_title_1custom_title_2 के साथ, आप पूर्व छुपा सकते की जगह और बाद में जोड़ने के लिए setFeatureInt उपयोग करना चाहते हैं:

findViewById(R.id.custom_title_1).setVisibility(View.GONE); 
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title_2); 
+1

नहीं बदलता है यदि बाद के संस्करणों में इनमें से कोई भी मान (title_container, com.android.internal) है? क्या ऐप को प्रभावित नहीं करेगा? – lostInTransit

+1

आप बिल्कुल सही हैं। भले ही com.android.internal.title_container निरंतर बदलने की संभावना नहीं है, लेकिन इस पर भरोसा करना गलत है। यह सबसे अच्छा एक बदसूरत कामकाज है। –

+0

धन्यवाद। यह अन्य समाधान महान काम करता है। लेकिन मैं वास्तव में समझ में नहीं आता क्यों setFeatureInt को बदलने के बजाय दूसरे के ऊपर एक दृश्य जोड़ना चाहिए? विचारों के साथ एएसपी जो एकवचन होने के लिए बाध्य हैं - शीर्षक की तरह! – lostInTransit

0

क्या आप पाठ को अपडेट करने के बाद दृश्य को फिर से निकालने के लिए अमान्य या पोस्ट इनवालिडेट को बुला रहे हैं? यदि यह एक कस्टम व्यू है, तो क्या आप ड्रॉ कोड में ब्रेकपॉइंट डाल सकते हैं ताकि यह सुनिश्चित किया जा सके कि इसे कॉल किया जा रहा है?

यदि आप यूआई थ्रेड पर हैं, तो आप 'अमान्य' कॉल कर सकते हैं यदि आप नहीं हैं, तो आपको 'postInvalidate' कॉल करना होगा या दृश्य स्वयं को फिर से नहीं हटाएगा।

+0

यदि यह मदद करता है, तो दृश्य को फिर से खींचा जाता है, मैं अद्यतन शीर्षक पट्टी देखता हूं लेकिन शीर्षक पट्टी पर नियंत्रण – lostInTransit

0

बस मेरा 2 सी लायक:

नक्शा सक्रियता में काम करते समय, कस्टम शीर्षक का अनुरोध करने के परिणामस्वरूप सभी शीर्षक दिखाए जा रहे थे।

सौभाग्य से, सभी मैं करना चाहता था अलग ढंग से शीर्षक पाठ सेट करने के लिए था, और मैं जल्द ही एहसास सिर्फ setTitle() onCreate के अंदर (बुला कि)

(के बाद मैं setContentView() कहा जाता है मैं इसे कहा जाता है) मेरे लिए काम किया

क्षमा करें, लेकिन मेरे पास अभी यह डीबग करने के लिए समय नहीं है और यह पता लगाना कि मैं जो कर रहा था वह काम नहीं कर रहा था, और इसे बदलने से यह काम क्यों कर रहा था। जैसा कि मैंने कहा, बस सोचा कि यह किसी को सड़क से बाहर निकलने में मदद कर सकता है।

requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); 
setContentView(R.layout.my_layout); 
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.my_custom_title); 
super.onCreate(savedInstanceState); 

कृपया ध्यान दें कि इन बयानों का क्रम बहुत महत्वपूर्ण है:

13

यह करने के लिए सही तरीका इस प्रकार है।

यदि आप किसी अन्य कथन से पहले super.onCreate() को कॉल करते हैं तो आपको एक खाली शीर्षक पट्टी मिल जाएगी, जो शीर्षक बार आईडी ढूंढने और इससे सभी दृश्यों को हटाने का हैक ठीक हो जाएगा लेकिन इसकी अनुशंसा नहीं की जाती है।

+0

ओपी क्रिएट() के बाद, रनटाइम के दौरान टाइटल बार बदलने की कोशिश कर रहा है। – CACuzcatlan

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