1

解決策を探した後、私はすでにここで尋ねられた質問を再質問することにしました。

TabHostコントロールがあり、それを他のレイアウト(LinearLayout)内に配置する必要があります。私はグーグルが私たちに与える例(http://developer.android.com/resources/tutorials/views/hello-tabwidget.html)を押し込み、TabHostがレイアウトのルートではないという唯一の違いと同じことをしましたビューを表示するアクティビティクラスはTabActivityを拡張しませんが、Activityを拡張します

私のxmlはこれです:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TabHost android:id="@+id/tabhost"
        android:layout_width="fill_parent" android:layout_height="fill_parent">
        <LinearLayout android:orientation="vertical"
            android:layout_width="fill_parent" android:layout_height="fill_parent"
            android:padding="5dp">
            <TabWidget android:id="@android:id/tabs"
                android:layout_width="fill_parent" android:layout_height="53px"
                android:tabStripEnabled="false" android:layout_margin="1px"
                android:background="#222222" />
            <FrameLayout android:id="@android:id/tabcontent"
                android:layout_width="fill_parent" android:layout_height="fill_parent"
                android:padding="5dp" />
        </LinearLayout>
    </TabHost>
</LinearLayout>

そしてjavaクラスはこれです:

public class TabsExampleActivity extends Activity {

    TabHost tabHost;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        initTabs();

    }


    private void initTabs() {
        Resources res = getResources();                     // Resource object to get Drawables
        tabHost = (TabHost) findViewById(R.id.tabhost);     // The activity TabHost

        TabHost.TabSpec spec;                               // Resusable TabSpec for each tab
        Intent intent;                                      // Reusable Intent for each tab        

        intent = new Intent("eu.pkg.tabsExample.BuildingTabActivity");
        spec = tabHost.newTabSpec("text").setIndicator("",
                          res.getDrawable(R.drawable.tab_text_selector))
                      .setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, ClipArtTabActivity.class);
        spec = tabHost.newTabSpec("clipart").setIndicator("",
                          res.getDrawable(R.drawable.tab_clipart_selector))
                      .setContent(intent);
        tabHost.addTab(spec);


        intent = new Intent().setClass(this, FrameSelectorTabActivity.class);
        spec = tabHost.newTabSpec("frame").setIndicator("",
                          res.getDrawable(R.drawable.tab_frame_selector))
                      .setContent(intent);
        tabHost.addTab(spec);



        intent = new Intent().setClass(this, BgSelectorTabActivity.class);
        spec = tabHost.newTabSpec("bg").setIndicator("",
                          res.getDrawable(R.drawable.tab_bg_selector))
                      .setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, BuildingTabActivity.class);
        spec = tabHost.newTabSpec("build").setIndicator("",
                          res.getDrawable(R.drawable.tab_build_selector))
                      .setContent(intent);
        tabHost.addTab(spec);

        tabHost.setCurrentTab(4);
    }
}

基本アクティビティとしてTabActivityを使用し、ルートとしてTabHostを使用すると、コードは正常に機能し、タブが表示されます...など。

この問題は、アクティビティを拡張した場合にのみ発生し、エラーは次のとおりです。

04-11 18:53:38.874:エラー/ AndroidRuntime(32539):java.lang.RuntimeException:アクティビティを開始できませんComponentInfo {eu.pkg.tabsExample / eu.pkg.tabsExample.TabsExampleActivity}:java.lang.NullPointerException

問題は、LinearLayout内でTabHostをホストする方法です。

編集:

コメントで提案されているように変更した後、logcatエラーは次のようになります。

04-11 20:52:01.993:ERROR / imdg81(28747):IsShutDownStarted()04-11 20:52:01.999:ERROR / SensorManager(28747):registerListener 4:gp2a光センサー遅延:240 04-11 20:52 :01.999:ERROR / SensorManager(28747):======= >>> Sensor Thread RUNNING <<< ======== 04-11 20:52:02.075:ERROR / imdg81(28747): IsShutDownStarted()04-11 20:52:02.284:ERROR / LockPatternKeyguardView(28747):電話の起動が完了しました。したがって、音楽プレーヤーにブロードキャストメッセージを送信できます04-11 20:52:05.507:ERROR / jdwp(3675):ハンドシェイクバイトの書き込みに失敗しました:パイプの破損(-1 of 14)04-11 20:52:05.609:ERROR / AndroidRuntime( 3675):致命的な例外:メイン04-11 20:52:05.609:エラー/ AndroidRuntime(3675):java.lang.RuntimeException:アクティビティを開始できませんComponentInfo {eu.pkg.tabsExample / eu.pkg.tabsExample.TabsExampleActivity}: java.lang.IllegalStateException:'public void setup(LocalActivityManager activityGroup)'を呼び出すのを忘れましたか?04-11 20:52:05.609:ERROR / AndroidRuntime(3675):android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)04-11 20:52:05.609:ERROR / AndroidRuntime(3675):android。 app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)04-11 20:52:05.609:ERROR / AndroidRuntime(3675):android.app.ActivityThread.access $ 2300(ActivityThread.java:125)04-11 20:52 :05.609:ERROR / AndroidRuntime(3675):android.app.ActivityThread $ H.handleMessage(ActivityThread.java:2033)04-11 20:52:05.609:ERROR / AndroidRuntime(3675):android.os.Handlerで。 dispatchMessage(Handler.java:99)04-11 20:52:05.609:ERROR / AndroidRuntime(3675):at android.os.Looper.loop(Looper.java:123)04-11 20:52:05.609:public void setup(LocalActivityManager activityGroup)'?04-11 20:52:05.609:ERROR / AndroidRuntime(3675):android.widget.TabHost $ IntentContentStrategy.getContentView(TabHost.java:654)04-11 20:52:05.609:ERROR / AndroidRuntime(3675):at android.widget.TabHost $ IntentContentStrategy.getContentView(TabHost.java:654) android.widget.TabHost.setCurrentTab(TabHost.java:328)04-11 20:52:05.609:ERROR / AndroidRuntime(3675):android.widget.TabHost.addTab(TabHost.java:213)04-11 20: 52:05.609:ERROR / AndroidRuntime(3675):eu.pkg.tabsExample.TabsExampleActivity.initTabs(TabsExampleActivity.java:43)04-11 20:52:05.609:ERROR / AndroidRuntime(3675):eu.pkg.tabsExample .TabsExampleActivity.onCreate(TabsExampleActivity.java:27)04-11 20:52:05.609:ERROR / AndroidRuntime(3675):at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)04-11 20:52:05.609 :

4

4 に答える 4

6

問題が解決しました。コメントの1つでユーザー207によって与えられた、別のスタックオーバーフローの質問からの正しい解決策は次のとおりです。

これはXMLです:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TabHost android:id="@android:id/tabhost"  
        android:layout_width="fill_parent" android:layout_height="fill_parent">
        <LinearLayout android:orientation="vertical"
            android:layout_width="fill_parent" android:layout_height="fill_parent"
            android:padding="5dp">
            <TabWidget android:id="@android:id/tabs"
                android:layout_width="fill_parent" android:layout_height="53px"
                android:tabStripEnabled="false" android:layout_margin="1px"
                android:background="#222222" />
            <FrameLayout android:id="@android:id/tabcontent"
                android:layout_width="fill_parent" android:layout_height="fill_parent"
                android:padding="5dp" />
        </LinearLayout>
    </TabHost>
</LinearLayout>

およびJavaファイル:

package eu.pkg.tabsExample;

import android.app.Activity;
import android.app.LocalActivityManager;
import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TabHost;

public class TabsExampleActivity extends Activity {

    TabHost tabHost;
    LocalActivityManager mLocalActivityManager;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        initTabs(savedInstanceState);
    }

    @Override
    protected void onResume() {
        mLocalActivityManager.dispatchResume(); 
        super.onResume();
    }

    @Override
    protected void onPause() {
        mLocalActivityManager.dispatchPause(isFinishing());
        super.onPause();
    }

    private void initTabs(Bundle savedInstanceState) {
        Resources res = getResources();                     // Resource object to get Drawables
        tabHost = (TabHost) findViewById(android.R.id.tabhost);     // The activity TabHost
        mLocalActivityManager = new LocalActivityManager(this, false);
        mLocalActivityManager.dispatchCreate(savedInstanceState);
        tabHost.setup(mLocalActivityManager);

        TabHost.TabSpec spec;                               // Resusable TabSpec for each tab
        Intent intent;                                      // Reusable Intent for each tab        

        intent = new Intent("eu.pkg.tabsExample.BuildingTabActivity");
        spec = tabHost.newTabSpec("text").setIndicator("",
                          res.getDrawable(R.drawable.tab_text_selector))
                      .setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, ClipArtTabActivity.class);
        spec = tabHost.newTabSpec("clipart").setIndicator("",
                          res.getDrawable(R.drawable.tab_clipart_selector))
                      .setContent(intent);
        tabHost.addTab(spec);


        intent = new Intent().setClass(this, FrameSelectorTabActivity.class);
        spec = tabHost.newTabSpec("frame").setIndicator("",
                          res.getDrawable(R.drawable.tab_frame_selector))
                      .setContent(intent);
        tabHost.addTab(spec);



        intent = new Intent().setClass(this, BgSelectorTabActivity.class);
        spec = tabHost.newTabSpec("bg").setIndicator("",
                          res.getDrawable(R.drawable.tab_bg_selector))
                      .setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, BuildingTabActivity.class);
        spec = tabHost.newTabSpec("build").setIndicator("",
                          res.getDrawable(R.drawable.tab_build_selector))
                      .setContent(intent);
        tabHost.addTab(spec);

        tabHost.setCurrentTab(4);
    }
}

舞台裏の魔法は、次の4行のコードにあります。

    tabHost = (TabHost) findViewById(android.R.id.tabhost);     // The activity TabHost
    mLocalActivityManager = new LocalActivityManager(this, false);
    mLocalActivityManager.dispatchCreate(savedInstanceState);
    tabHost.setup(mLocalActivityManager);

この回答にご協力いただきありがとうございます。

于 2012-04-12T14:40:44.553 に答える
0

TabActivityを拡張する代わりにActivityを使用している場合の解決策は次のとおりです

https://stackoverflow.com/a/5098774/563306

于 2012-04-11T17:01:00.637 に答える
0

この特定の行を変更します

TabHost android:id = "@ + id / tabhost"

TabHost android:id = "@ android:id / tabhost"

編集

また、次の行の後に追加します

tabHost = (TabHost) findViewById(R.id.tabhost);
tabHost.setup();
于 2012-04-11T17:13:03.517 に答える
0

これでエラーが修正されます。

さらに、「ネストされたタブ」を実現しようとしているのではActivityなく、拡張したいということを読みました。別の内TabActivityにあることは問題ではないはずです。これまでにこれを行ったことがありませんが、問題が発生する可能性はありません。またはをタブコンテンツとして追加することに違いはありません。あなたはそれを試してみることができますTabActivityTabActivityActivityTabActivity

于 2012-04-12T09:11:12.010 に答える