Как исправить эту ошибку, появляющуюся, когда я программно устанавливаю цвет вкладки bg? - PullRequest
1 голос
/ 06 октября 2011

Я использую этот код для установки собственного цвета фона для моих вкладок

//setting up the tabs
res = getResources(); // Resource object to get Drawables
TabHost tabHost = getTabHost();  // The activity TabHost
TabHost.TabSpec spec;  // Resusable TabSpec for each tab
Intent intent;  // Reusable Intent for each tab

intent = new Intent().setClass(this, First.class);

spec = tabHost.newTabSpec("one").setIndicator("One")
        .setContent(intent);
tabHost.addTab(spec);

intent = new Intent().setClass(this, Second.class);
spec = tabHost.newTabSpec("two").setIndicator("Two")
        .setContent(intent);
tabHost.addTab(spec);

tabHost.getTabWidget().getChildAt(0).setBackgroundResource(R.color.light);
tabHost.getTabWidget().getChildAt(1).setBackgroundResource(R.color.light);
tabHost.getTabWidget().setDividerDrawable(R.color.light);

tabHost.setCurrentTab(0);

Когда страница загружается, все в порядке и появляется вкладка 0. Но когда я нажимаю на вторую вкладку, приложение вылетает, и я получаю ошибку

10-06 10:54:39.516: ERROR/AndroidRuntime(920): FATAL EXCEPTION: main
        java.lang.NullPointerException
        at android.widget.TabWidget.focusCurrentTab(TabWidget.java:370)
        at android.widget.TabHost.setCurrentTab(TabHost.java:323)
        at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:132)
        at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:456)
        at android.view.View.performClick(View.java:2485)
        at android.view.View$PerformClick.run(View.java:9080)
        at android.os.Handler.handleCallback(Handler.java:587)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:123)
        at android.app.ActivityThread.main(ActivityThread.java:3683)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:507)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
        at dalvik.system.NativeStart.main(Native Method)

Есть идеи, как решить эту проблему?

PS. Если я прокомментирую 3 строки, которые задают цвета bg, виджет со вкладками работает без ошибок.

Ответы [ 4 ]

3 голосов
/ 21 июня 2013

Я столкнулся с этой проблемой, и исправление было приятным и простым:

Вам нужно установить нарисованный разделитель ДО того, как вы добавите вкладки в TabHost.

Итак, следующая строка:

tabHost.getTabWidget().setDividerDrawable(R.color.light);

должно быть перемещено вверх. Вы можете позвонить, если сразу после:

TabHost tabHost = getTabHost();

Для меня это решило проблему. Надеюсь, это кому-нибудь поможет!

0 голосов
/ 06 октября 2011

Попробуйте использовать это:

 //setting up the tabs
res = getResources(); // Resource object to get Drawables
TabHost tabHost = getTabHost();  // The activity TabHost
TabHost.TabSpec spec;  // Resusable TabSpec for each tab
Intent intent;  // Reusable Intent for each tab

intent = new Intent().setClass(this, First.class);

spec = tabHost.newTabSpec("one").setIndicator("One")
        .setContent(intent);
tabHost.addTab(spec);

intent = new Intent().setClass(this, Second.class);
spec = tabHost.newTabSpec("two").setIndicator("Two")
        .setContent(intent);
tabHost.addTab(spec);    

tabHost.setCurrentTab(0);

tabHost.setOnTabChangedListener(new OnTabChangeListener() {

        @Override
        public void onTabChanged(String arg0) {
                // TODO Auto-generated method stub
                setTabColor(tabHost);
        }
});

setTabColor(tabHost);

вот метод setTabColor ():

//Change The Backgournd Color of Tabs
public void setTabColor(TabHost tabhost) {

    for(int i=0;i<tabhost.getTabWidget().getChildCount();i++)
        tabhost.getTabWidget().getChildAt(i).setBackgroundColor(COLOR_DARK); //unselected

        tabhost.getTabWidget().getChildAt(tabhost.getCurrentTab()).setBackgroundColor(COLOR_LIGHT); // selected
}
0 голосов
/ 28 марта 2013

пожалуйста! удалить строку ниже из вашего кода:

tabHost.getTabWidget().setDividerDrawable(R.color.light);
0 голосов
/ 06 октября 2011

Перед установкой цвета сделайте нулевую проверку для ребенка.

...