TabActivityは非推奨になっているため、Fragmentsでそれを行う方法を見つける必要があります。
使用したくない場合は、タブのコンテンツTabActivity
に入れることを忘れてください。FragmentActivities
TabWidget
なしで使用できることを思い出しますTabActivity
。したがって、このソリューションを試すことができます。
- を1つだけ作成します
FragmentActivity
。
- のレイアウト
TabWidget
に入れます。FragmentActivity
のコンテンツTabWidget
の高さを0にします。
- XMLで
TabWidget
コンテナを宣言しますFragment
(FrameLayout
たとえば)。
FragmentActivity
どのタブが選択されているかを処理し()TabHost.OnTabChangeListener
、必要なものFragment
をコンテナに入れます。
- プログラムロジック(以前はさまざまなアクティビティで使用されていました)をさまざまなフラグメントに配置します。
または、を使用して作成することもできます。sFragmentActivity
をTabWidget
切り替える代わりに、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
、フラグメントを別のフラグメントに移動している間、何度も何度も呼び出します。onDestroyView
replace
また、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