5

TabActivityは非推奨になっているため、Fragmentsでそれを行う方法を見つける必要があります。Fragmentsがどのように機能するかを知る前に、Fragmentsを使用しましたが、FragmentActivitiesを使用してタブホストを作成するためのガイドが必要です。インターネットでいくつかの例を見つけました。それらはすべて、タブのコンテナーにフラグメントを入れることに関するものです。

私が欲しいのは、各タブにFragmentActivitiesを配置することです。私のアプリケーションでは4つのタブを使用し、各タブには非常に複雑なコンテンツが含まれているためです。その結果、個別のコンテナ内の各タブの下に配置するフラグメントを管理するために、タブごとにFragmentActivityが必要になります。

解決:

答えてインターネットで検索した後、私は解決策にたどり着きました。私が見つけた解決策によると、タブホストの下のタブごとに別々のスタックにあるフラグメントを追跡します。これが私のGitHubリポジトリです。この問題のために、小さなサンプルアプリを作成しました。

4

2 に答える 2

9

TabActivityは非推奨になっているため、Fragmentsでそれを行う方法を見つける必要があります。

使用したくない場合は、タブのコンテンツTabActivityに入れることを忘れてください。FragmentActivities

TabWidgetなしで使用できることを思い出しますTabActivity。したがって、このソリューションを試すことができます。

  1. を1つだけ作成しますFragmentActivity
  2. のレイアウトTabWidgetに入れます。FragmentActivityのコンテンツTabWidgetの高さを0にします。
  3. XMLでTabWidgetコンテナを宣言しますFragmentFrameLayoutたとえば)。
  4. FragmentActivity どのタブが選択されているかを処理し()TabHost.OnTabChangeListener、必要なものFragmentをコンテナに入れます。
  5. プログラムロジック(以前はさまざまなアクティビティで使用されていました)をさまざまなフラグメントに配置します。

または、を使用して作成することもできます。sFragmentActivityTabWidget切り替える代わりに、sを各タブのコンテンツに Fragment直接配置できます。Fragment

たとえば、3つのタブと3つのフラグメントがある場合は、私が行うことを試してください。showFragmentXあるフラグメントを別のフラグメントに変更する必要がある場合に呼び出します。

public class Test extends FragmentActivity {

private Fragment1 fragment1=new Fragment1();
private Fragment2 fragment2=new Fragment2();
private Fragment3 fragment3=new Fragment3();

private void showFragment1(){
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.fragments_container, fragment1);
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    ft.commit();
}

private void showFragment2(){
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.fragments_container, fragment2);
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    ft.commit();
}

private void showFragment3(){
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.fragments_container, fragment3);
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    ft.commit();
}

@Override
protected void onCreate(Bundle arg0) {
    // TODO Auto-generated method stub
    super.onCreate(arg0);
    setContentView(R.layout.fragmentactivity_layout);
}
}

そうすると、fragmentX変数をに入れるたびに変数が削除されることはありませんfragment_container。彼らはあなたの生きている間FragmentActivity生きます。フラグメントのライフサイクルを見てください。フラグメントのメソッドのみがOnCreateView、フラグメントを別のフラグメントに移動している間、何度も何度も呼び出します。onDestroyViewreplace

また、Fragmentsには、onSaveInstanceStateフラグメントの状態を保存できるメソッドがあります。例:ユーザーがfragment1のeditTextに自分の名前を入力しました。ユーザーが他のフラグメントを検出している間、このデータ(名前文字列)を保持したい場合は、

1.fragment1のメソッドに名前の文字列を保存します2.fragment1 の onSaveInstanceStateメソッドに保存されたInstanceStateバンドルをチェックします(nullでない場合)-バンドルから取得した文字列をedittextに入力します。
onCreateView

public class Fragment1 extends Fragment {

EditText nameEditText;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,  Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);

    View fragment1View=inflater.inflate(R.layout.fragment1_layout, container, false);
    nameEditText=(EditText) fragment1View.findViewById(R.id.edittext_name);

    //check for saved data. if it is not null - fill your edittext with saved string
    if(savedInstanceState!=null){
        String nameString=(String) savedInstanceState.get("nameString");
        nameEditText.setText(nameString);
    }
    return fragment1View;
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    //save data that user have entered
    outState.putString("nameString", nameEditText.getText().toString());
}

}

保存する前にデータを確認できます。私の主張が明確になったことを願っています。

また、-のメソッドを呼び出すとsetRetainInstance(true) 、システムはフラグメントの状態を(すべての入力データとともに)保存しようとします。説明へのリンクonCreateView()fragment

于 2012-09-10T09:08:18.913 に答える
1

タブのコンテンツを個別のアクティビティに配置するアプローチは廃止されました。これは、フラグメントフレームワークがあるためです。タブの複雑なコンテンツをフラグメントに配置し、ユーザーがタブを選択したときにそれらのフラグメントを交換する必要があります。

このための推奨される解決策は、TabHostウィジェットを使用する代わりに、タブナビゲーションでActionBarを使用することです。

于 2012-09-10T08:37:33.290 に答える