5

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

私が望むのは、各タブにFragmentActivitiesを配置することです。私のアプリケーションでは4つのタブを使い、それぞれのタブには本当に複雑な内容が含まれているためです。その結果、分割されたコンテナ内の各タブの下に配置するフラグメントを管理するために、各タブごとにFragmentActivityを設定する必要があります。

SOLUTION:

答えた後、私は解決策になってしまった、インターネット上で検索を。私が見つけた解決策によると、タブホストの下にある各タブの断片化されたスタック内の断片を追跡しています。 Hereは私のGitHubリポジトリですが、私はこの問題の小さなサンプルアプリケーションを作成しました。

答えて

9

TabActivityは非難されているので、私はFragmentsでそれを行う方法を見つける必要があります。

TabActivityを使用しない場合は、FragmentActivitiesをタブのコンテンツに入れないでください。

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

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

それともTabWidgetFragmentActivityを作成し、代わりにあなたが直接、各タブのコンテンツへFragment Sを置くことができるFragment秒の切り替えができます。

たとえば、3つのタブと3つの断片がある場合は、私がやっていることを試してみてください。 1つのフラグメントを別のフラグメントに変更する必要がある場合は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が生きている間生き続けます。 fragments lifecycleをご覧ください。 OnCreateViewonDestroyViewのフラグメントのメソッドだけが何度も繰り返し呼び出しますが、replaceのフラグメントが別のフラグメントに呼び出されます。

また、フラグメントには、フラグメントの状態を保存できるonSaveInstanceStateメソッドがあります。例:ユーザーが、fragment1のeditTextに自分の名前をタイプしました。あなたは、このデータを保持する場合(名前文字列)ユーザーがfragment1のonCreateViewメソッドチェックsavedInstanceStateバンドルにあなたがfragment1のonSaveInstanceState方法
2の

1.save名の文字列べき他の断片を発見しながら、それがnullではない場合、 - のEditTextを埋めますあなたがバンドルから得る文字列で。

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

}

あなたは、保存する前にデータを確認することができます。今私の要点が明確になることを願っています。

またのonCreateView()メソッドでsetRetainInstance(true)を呼び出した場合、システムは(すべての入力データを使用して)フラグメントの状態を保存しようとします。 link to description

+0

答えがThxですが、アクティビティの代わりにフラグメントをタブに入れると別の問題が発生します。たとえば、最初のタブでは、ユーザーがボタンをクリックした場合にコンテナを別のフラグメントに置き換え、次にタブを変更して2番目のタブに移動すると、前のフラグメントが置き換えられます。したがって、最初のタブに再度移動すると、フラグメントが再び作成され、前のページを表示できなくなります。どのようにそれを取り除くか考えていますか? – osayilgan

+0

私は私の答えを編集しました。それを見てください。また、サンプル( "ApiDemos")の断片例もあります。それらをチェックしてください。 –

+0

ええ、私はそれを得ましたが、これは私が求めているものではありません。私は断片で作業して、それがどのように機能するのか知っています。私が知りたくないことは、次のとおりです。最初のタブにいるとし、ユーザーがボタンをクリックしたときに別のフラグメントを呼び出したとします。2番目のステップでは、タブを2番目のステップに変更しました。それは2番目のタブの断片を右にしていますか?しかし、私はまた、最初のタブで変更されたものを維持したい。したがって、この方法で、私はちょうど前のタブで以前に変更されたコンテンツを保持しません。何か案が ? – osayilgan

1

タブの内容を別々のアクティビティに配置する方法は廃止されました。ここではFragmentフレームワークが用意されています。タブの複雑な内容をフラグメントに入れ、ユーザーがタブを選択したときにそれらのフラグメントをスワップする必要があります。

これは、TabHostウィジェットを使用する代わりにタブナビゲーションでActionBarを使用することをお勧めします。

+0

答えをいただきありがとうございます、私はそれを使用することについていくつかの懸念があります。たとえば、最初のタブのフラグメントを置くと、同じタブ内でナビゲーションが必要になります。私が知っている限り、タブ全体とその中のフラグメントには1つのコンテナしか使用していません。メインのコンテナを第1のタブ内に置いて、それを第2のタブに変更します。これを行うと、作成して第1のタブ内のコンテナに入れたすべてのフラグメントが削除され、コンテナ、 – osayilgan

+0

これは、最初のタブで作成したすべてのデータが削除され、2番目のフラグメントに置き換えられることを意味しますか?最初のタブに戻るとどうなりますか? 私はそれを再現しますか? – osayilgan

関連する問題