1

Я пытаюсь использовать tabhost с 4 виджетами, я тестировал это на Android 4.2, и он работает как шарм, однако на Android 2.2 он дает мне nullpointerexception при изменении вкладокTabHost nullpointer exception in android 2.2

Я знаю, что есть известная проблема с tabhosts и android 2.1/2.2, но я не могу заставить ее работать с другими исправлениями, которые люди предлагали в других потоках.

Примечание: Я использую Android Annotations

Вот LogCat:

03-23 10:29:08.869: E/AndroidRuntime(423): FATAL EXCEPTION: main 
03-23 10:29:08.869: E/AndroidRuntime(423): java.lang.NullPointerException 
03-23 10:29:08.869: E/AndroidRuntime(423): at android.widget.TabWidget.focusCurrentTab(TabWidget.java:367) 
03-23 10:29:08.869: E/AndroidRuntime(423): at android.widget.TabHost.setCurrentTab(TabHost.java:320) 
03-23 10:29:08.869: E/AndroidRuntime(423): at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:129) 
03-23 10:29:08.869: E/AndroidRuntime(423): at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:453) 
03-23 10:29:08.869: E/AndroidRuntime(423): at android.view.View.performClick(View.java:2408) 
03-23 10:29:08.869: E/AndroidRuntime(423): at android.view.View$PerformClick.run(View.java:8816) 
03-23 10:29:08.869: E/AndroidRuntime(423): at android.os.Handler.handleCallback(Handler.java:587) 
03-23 10:29:08.869: E/AndroidRuntime(423): at android.os.Handler.dispatchMessage(Handler.java:92) 
03-23 10:29:08.869: E/AndroidRuntime(423): at android.os.Looper.loop(Looper.java:123) 
03-23 10:29:08.869: E/AndroidRuntime(423): at android.app.ActivityThread.main(ActivityThread.java:4627) 
03-23 10:29:08.869: E/AndroidRuntime(423): at java.lang.reflect.Method.invokeNative(Native Method) 
03-23 10:29:08.869: E/AndroidRuntime(423): at java.lang.reflect.Method.invoke(Method.java:521) 
03-23 10:29:08.869: E/AndroidRuntime(423): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
03-23 10:29:08.869: E/AndroidRuntime(423): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
03-23 10:29:08.869: E/AndroidRuntime(423): at dalvik.system.NativeStart.main(Native Method) 

Вот мой код:

@NoTitle 
@EActivity(R.layout.activity_base) 
public class BaseActivity extends TabActivity { 

    Context mContext; 

    @ViewById 
    Button btnBaseDeconnecter; 

    @ViewById 
    TextView txtBaseInfos; 

    @AfterViews 
    void afterViews() { 
     mContext = this; 
     TabHost tabHost = getTabHost(); 

     /* tid1 is firstTabSpec Id. Its used to access outside. */ 
     TabSpec firstTabSpec = tabHost.newTabSpec("0"); 
     TabSpec secondTabSpec = tabHost.newTabSpec("1"); 
     TabSpec thirdTabSpec = tabHost.newTabSpec("2"); 
     TabSpec fourthTabSpec = tabHost.newTabSpec("3"); 


     /* TabSpec setIndicator() is used to set name for the tab. */ 
     /* TabSpec setContent() is used to set content for a particular tab. */ 
     firstTabSpec.setIndicator(
       prepareTabView(mContext, getResources().getDrawable(R.drawable.enlevement))).setContent(
       new Intent(this, EnlevementActivity_.class)); 
     secondTabSpec.setIndicator(
       prepareTabView(mContext, getResources().getDrawable(R.drawable.travaux))).setContent(
       new Intent(this, TravauxListActivity_.class)); 
     thirdTabSpec.setIndicator(
       prepareTabView(mContext, getResources().getDrawable(R.drawable.compte))).setContent(
       new Intent(this, CompteActivity_.class)); 
     fourthTabSpec.setIndicator(
       prepareTabView(mContext, getResources().getDrawable(R.drawable.contact))).setContent(
       new Intent(this, ContactActivity_.class)); 
     tabHost.setup(); 
     /* Add tabSpec to the TabHost to display. */ 
     tabHost.addTab(firstTabSpec); 
     tabHost.addTab(secondTabSpec); 
     tabHost.addTab(thirdTabSpec); 
     tabHost.addTab(fourthTabSpec); 
     tabHost.getTabWidget().setStripEnabled(false); 
     tabHost.getTabWidget().setDividerDrawable(R.drawable.empty_divider); 


    } 
    public static View prepareTabView(Context context, Drawable background) { 
     View view = LayoutInflater.from(context).inflate(R.layout.fake_native_tab, null); 
     ImageView img = (ImageView)view.findViewById(R.id.fakeNativeTabImageView); 
     img.setImageDrawable(background); 
     return view; 
    } 




} 
+0

Это исключение происходит из-за того, что вы пытаетесь открыть конкретную вкладку или когда пытаетесь открыть любую вкладку или свои четыре вкладки? –

+0

Он загружается на первую вкладку, когда приложение запускается, как и следовало ожидать, но если я нажму на вторую вкладку, она отправит меня на третью, и когда я нажимаю на третью или четвертую вкладку, она вылетает –

+0

Precions: он отправляет меня к третьему виджету, но ко второму классу –

ответ

3

Использовать tabHost.getTabWidget().setDividerDrawable(null); вместо R.drawable.empty_divider.

Рассуждение:

Глядя на StackTrace и Android 2.2 source for TabWidget.java, кажется, есть проблема в методе getChildTabViewAt(int index) где, если dividerDrawable не нулевой, то он пропускает взгляды делителя на панели вкладок, чтобы получить фактические TabView.

public View getChildTabViewAt(int index) { 
    // If we are using dividers, then instead of tab views at 0, 1, 2, ... 
    // we have tab views at 0, 2, 4, ... 
    if (mDividerDrawable != null) { 
     index *= 2; 
    } 
    return getChildAt(index); 
} 

Я думаю, что происходит, когда вы используете R.drawable.empty_divider для dividerDrawable мнения разделительные не втянуться, поэтому их следует рассматривать как если бы они были null. Как вы можете видеть, этого не происходит, поэтому это объясняет исключение NullPointerException и странное поведение, когда вы нажимаете одну вкладку и выбираете другую.

0

Используйте backword совместимые средства библиотеки добавить android.support.v4.jar в папке libs и попытайтесь использовать тот же класс из этой библиотеки, который будет совместим как с нижней, так и с более высокой версией.

+0

, библиотека android.support.v4.jar не содержит класс TabHost или TabHostActivity –