1

4つのウィジェットでタブホストを使用しようとしています。これをAndroid4.2でテストしました。これは魅力のように機能しますが、Android 2.2では、タブを変更するとnullpointerexceptionが発生します。

タブホストとAndroid2.1/ 2.2には既知の問題があることは知っていますが、他のスレッドで提案されている他の修正では機能しないようです。

注:Androidアノテーションを使用しています

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;
    }




}
4

2 に答える 2

3

tabHost.getTabWidget().setDividerDrawable(null);の代わりに使用してくださいR.drawable.empty_divider

理由:

TabWidget.javaのスタックトレースとAndroid2.2ソースを見るgetChildTabViewAt(int index)と、dividerDrawableがnullでない場合、実際のタブビューを取得するためにタブバーの仕切りビューをスキップするというメソッドに問題があるようです。

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);
}

仕切りビューをdividerDrawableに使用するとどうなるかと思いますがR.drawable.empty_divider、仕切りビューは描画されないので、あたかも描画されているかのように扱う必要がありnullます。ご覧のとおり、これは発生しないため、NullPointerExceptionと、あるタブをクリックして別のタブを選択するという奇妙な動作が説明されます。

于 2013-03-23T11:32:15.557 に答える
0

バックワード互換ライブラリを使用するということは、libsフォルダーにandroid.support.v4.jarを追加し、このライブラリの同じクラスを使用して、下位バージョンと上位バージョンの両方と互換性を持たせることを意味します

于 2013-03-23T10:00:35.883 に答える