سؤال

لدي النشاط الذي لديه TabHost تحتوي على مجموعة من TabSpecs مع كل listview التي تحتوي على العناصر التي سيتم عرضها في علامة التبويب.عند كل TabSpec يتم تعيين رمز ليتم عرضها في علامة التبويب رأس.

على TabSpecs تم إنشاؤها في هذا الطريق داخل setupTabs() الطريقة التي الحلقات لخلق المناسبة عدد من علامات التبويب:

TabSpec ts = mTabs.newTabSpec("tab");
ts.setIndicator("TabTitle", iconResource);

ts.setContent(new TabHost.TabContentFactory(
{
    public View createTabContent(String tag)
    {
        ... 
    }            
});
mTabs.addTab(ts);

هناك بعض الحالات حيث كنت تريد أن تكون قادرة على تغيير رمز التي يتم عرضها في كل علامة تبويب أثناء تنفيذ البرنامج.حاليا أنا حذف جميع علامات التبويب ، داعيا رمز أعلاه مرة أخرى إلى إعادة إنشائها.

mTabs.getTabWidget().removeAllViews();
mTabs.clearAllTabs(true);
setupTabs();

هل هناك طريقة استبدال الرمز الذي يتم عرضه دون حذف ثم إعادة إنشاء كافة علامات التبويب ؟

هل كانت مفيدة؟

المحلول

الجواب القصير هو أنك لا تفقد أي شيء.الروبوت SDK لا توفر طريقة مباشرة لتغيير مؤشر TabHost بعد ذلك تم إنشاؤه.على TabSpec يستخدم فقط لبناء علامة التبويب حتى تغيير TabSpec بعد الواقع لن يكون له أي تأثير.

أعتقد أن هناك مشكلة ، بالرغم من ذلك.الاتصال mTabs.getTabWidget() للحصول على TabWidget الكائن.هذا هو مجرد مجموعة فرعية من ViewGroup, لذا يمكنك الاتصال getChildCount() و getChildAt() للوصول إلى علامات الفردية داخل TabWidget.كل من علامات التبويب هذه أيضا وجهة نظر, و في حالة التبويب مع الرسومية مؤشر نص التسمية ، فإنه من شبه المؤكد أخرى ViewGroup (ربما LinearLayout, ولكن لا يهم) الذي يحتوي على ImageView و TextView.حتى مع القليل من تافه مع المصحح أو Log.i, ، يجب أن تكون قادرا على معرفة وصفة للحصول على ImageView وتغييره مباشرة.

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

نصائح أخرى

فقط لتأكيد dominics الجواب هنا له حل في المدونة (التي تعمل في الواقع):

tabHost.setOnTabChangedListener(new OnTabChangeListener() {
    public void onTabChanged(String tabId) {
        if (TAB_MAP.equals(tabId)) {
            ImageView iv = (ImageView) tabHost.getTabWidget().getChildAt(0).findViewById(android.R.id.icon);
            iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_map_black));
            iv = (ImageView) tabHost.getTabWidget().getChildAt(1).findViewById(android.R.id.icon);
            iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_list_white));
        } else if (TAB_LIST.equals(tabId)) {
            ImageView iv = (ImageView) tabHost.getTabWidget().getChildAt(0).findViewById(android.R.id.icon);
            iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_map_white));
            iv = (ImageView) tabHost.getTabWidget().getChildAt(1).findViewById(android.R.id.icon);
            iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_list_black));
        }
    }
});

بالطبع ليس مصقول في استخدام تلك المباشر المؤشرات في getChildAt() ليست لطيفة على الإطلاق...

قد يكون في وقت متأخر قليلا ولكن قد ترغب في إلقاء نظرة على هذا الموضوع

http://groups.google.com/group/android-developers/browse_thread/thread/ef3bdebcb715b385

انظر منصبي مع التعليمات البرمجية المثال فيما يتعلق تخصيص علامات التبويب الروبوت.

شكرا Spct

هذا هو ما فعلته وأنه يعمل بالنسبة لي.أنا خلقت هذه الوظيفة في النشاط الذي يمتد من TabBarActivity

public void updateTab(int stringID) {
    ViewGroup identifyView = (ViewGroup)getTabWidget().getChildAt(0);
    TextView v =  (TextView)identifyView.getChildAt(identifyView.getChildCount() - 1);
    v.setText(stringID);
}

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

اتصلت هذه الوظيفة من الأنشطة ذات الصلة باستخدام هذه الدعوة

getParent().updateTab(R.string.tab_bar_analyze);

جرب هذا:

tabHost.setOnTabChangedListener(new OnTabChangeListener() {
    public void onTabChanged(String tabId) {
        if (TAB_MAP.equals(tabId)) {
            ImageView iv = (ImageView) tabHost.getTabWidget().getChildAt(0).findViewById(android.R.id.icon);
            iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_map_black));
            iv = (ImageView) tabHost.getTabWidget().getChildAt(1).findViewById(android.R.id.icon);
            iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_list_white));
        } else if (TAB_LIST.equals(tabId)) {
            ImageView iv = (ImageView) tabHost.getTabWidget().getChildAt(0).findViewById(android.R.id.icon);
            iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_map_white));
            iv = (ImageView) tabHost.getTabWidget().getChildAt(1).findViewById(android.R.id.icon);
            iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_list_black));
        }
    }
});
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top