الروبوت - تغيير عنوان مخصص لعرض في وقت التشغيل

StackOverflow https://stackoverflow.com/questions/820398

  •  03-07-2019
  •  | 
  •  

سؤال

أنا باستخدام عنوان مخصص بالنظر في طلبي لكل نشاط.في واحدة من الأنشطة على أساس من النقرات على زر أنا بحاجة إلى تغيير عنوان مخصص الرأي.الآن هذا يعمل بشكل جيد في كل مرة عندما كنت جعل الدعوة إلى 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();
هل كانت مفيدة؟

المحلول

المشكلة هي أن فقط Window تنفيذ (PhoneWindow) يستخدم LayoutInflater في setFeatureInt طريقة instantiates التصميم الجديد مع 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 السلوك هو المقصود ، لكنها بالتأكيد ليست موثقة طريقة واحدة أو أخرى وهذا هو السبب أنا سآخذ هذا إلى الروبوت المشروعات الإنمائية ;)

تحرير

كما أشار في التعليقات المذكورة الحل ليس مثاليا.بدلا من الاعتماد على 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_1 مع custom_title_2, هل يمكن إخفاء السابق واستخدام setFeatureInt لإضافة الأخير:

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

نصائح أخرى

الطريقة الصحيحة للقيام بذلك كما يلي:

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

يرجى ملاحظة أن ترتيب هذه البيانات مهم جدا.

إذا كنت استدعاء السوبر.onCreate الخاص() قبل أي من البيانات الأخرى سوف تحصل فارغة عنوان شريط الاختراق من العثور على شريط العنوان معرف وإزالة جميع وجهات النظر من أنه سيتم إصلاح ولكن لا ينصح.

أنت تدعو إلى إبطال أو postInvalidate إلى إعادة نظر بعد تحديث النص ؟ إذا كان عرض مخصص, يمكنك وضع نقطة توقف في رسم رمز للتأكد من الحصول على اسمه ؟

إذا كنت على UI, يمكنك الاتصال 'يبطل' إذا كنت لا, يجب استدعاء 'postInvalidate' أو رأي لن رسم نفسه.

فقط 2c يستحق:

عند العمل في MapActivity, طلب مخصص العنوان إلى العنوان في كل عرض.

لحسن الحظ, كل ما أردت القيام به هو تعيين عنوان النص بشكل مختلف ، وسرعان ما أدركت أن مجرد الدعوة setTitle() داخل onCreate الخاص() عملت بالنسبة لي (لقد دعا ذلك بعد أن دعا setContentView())

آسف, ولكن لا وقت لدي الآن إلى تصحيح هذا أي أكثر و معرفة السبب ما كنت أفعله لم ينجح و السبب في تغيير جعلت من العمل.كما قلت ظننت أن هذا قد يساعد شخص ما على الطريق.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top