16

TabHostネストされたアクティビティを持つ3つの異なるタブを表示するためにを使用するAndroidアプリケーション(1.6互換性)のアップグレードに取り組んでいます。

当時、私はこのActivityGroupトリックを使用してネストされたアクティビティをタブに表示していましたが、一部の機能を処理するのは非常に面倒なので、この方法には非常に不満があります。

1.6用のFragmentsAPI互換性パッケージについて聞いたことがあり、Fragmentやりたいこと(トランジション効果などを含むタブ内にネストされたビュー/機能を表示する)に最適に見えますが、TabHost(で動作しAction Barますが、互換性パッケージでは利用できません)。

アプリケーションでそのような構造を作成する方法を見つけた人はいますか?

ここでの私のエラーは:

ERROR/AndroidRuntime(955): Caused by: java.lang.RuntimeException: Unable

アクティビティを開始するにはComponentInfo{com.XXX}:java.lang.IllegalArgumentException:フラグメントMyFragmentのID0x1020011のビューが見つかりません

コード

main.xml

<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    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">

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:padding="5dp"
            android:layout_weight="1" />

        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0" />

    </LinearLayout>

</TabHost>

MainActivity.java

public class MainActivity extends TabActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        Resources res = getResources();
        final TabHost tabs = getTabHost(); 
        TabHost.TabSpec spec;
        Intent i;

        i = new Intent(this, MyActivity.class);
        spec = tabs.newTabSpec("MyActivity").setIndicator("MyActivity",res.getDrawable(R.drawable.tab)).setContent(i);
        tabs.addTab(spec);

    }

}

MyActivity.class

public class MyActivity extends FragmentActivity {

    private static String TAG = "MyActivity";
    private static FragmentManager fragmentManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        ListeResultatFragment fragment = MyFragment.newInstance();
        fragmentTransaction.add(android.R.id.tabcontent, fragment, "MyFragment");
        fragmentTransaction.commit();

    }

}

MyFragment.java

public class MyFragment extends Fragment {

    public static MyFragment newInstance() {
        MyFragment instance = new MyFragment();
        return instance;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment, container, false);
    }

}
4

2 に答える 2

10

問題は、コンテナIDとして使用MyActivityして、囲みに手を差し伸べようとすることです。これは不可能です。代わりに、フラグメントの親として使用できる独自のレイアウト(FrameLayoutなど)が必要です。このレイアウトには、idで参照できるビューが存在する必要があります。MainActivityandroid.R.id.tabcontentMyActivity

activity_layout.xmlIDが'framelayout'のFrameLayoutを含むというレイアウトがあるとします。onCreate次に、メソッドMyActivityを次のように変更できます。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    View parent = getLayoutInflater().inflate(R.layout.activity_layout, null);
    setContentView(parent);

    fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    Fragment fragment = MyFragment.newInstance();
    fragmentTransaction.add(R.id.framelayout, fragment, "MyFragment");
    fragmentTransaction.commit();
}

言い換えれば、MyActivityそれ自体で作業できる必要があります。最初に機能するようにしてからMyActivityMainActivity含まれているTabHostに埋め込みます。

于 2011-07-07T20:03:48.750 に答える
4

独自のタブバーを作成してみませんか。構築は非常に簡単です。いくつかのボタンを含むLinearLayoutを追加し、FragmentManagerを使用してフラグメントを切り替えるようにonClickListenerを設定するだけです。フラグメントマネージャは、FragmentActivityから取得できます。

FragmentManager fragmentManager = getSupportFragmentManager();

onClickハンドラーでは、正しいフラグメントに切り替えるためのトランザクションを実行するだけです。

于 2011-07-07T17:35:09.683 に答える