TabActivityは非難されているので、私はFragmentsでそれを行う方法を見つける必要があります。
TabActivity
を使用しない場合は、FragmentActivities
をタブのコンテンツに入れないでください。
TabWidget
をTabActivity
なしで使用できることを思い出します。したがって、このソリューションを試すことができます:
FragmentActivity
の1つを作成してください。
- のレイアウトに
TabWidget
を入れてください。 TabWidget
のコンテンツの高さを0にします。
TabWidget
のXMLは、Fragment
(たとえばFrameLayout
)の宣言コンテナです。
FragmentActivity
では、どのタブが選択されているか(TabHost.OnTabChangeListener
)、コンテナにはFragment
が必要です。
- プログラムのロジック(異なるアクティビティの初期のもの)を別のフラグメントに置き換えます。
それともTabWidget
でFragmentActivity
を作成し、代わりにあなたが直接、各タブのコンテンツへ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をご覧ください。 OnCreateView
とonDestroyView
のフラグメントのメソッドだけが何度も繰り返し呼び出しますが、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
答えがThxですが、アクティビティの代わりにフラグメントをタブに入れると別の問題が発生します。たとえば、最初のタブでは、ユーザーがボタンをクリックした場合にコンテナを別のフラグメントに置き換え、次にタブを変更して2番目のタブに移動すると、前のフラグメントが置き換えられます。したがって、最初のタブに再度移動すると、フラグメントが再び作成され、前のページを表示できなくなります。どのようにそれを取り除くか考えていますか? – osayilgan
私は私の答えを編集しました。それを見てください。また、サンプル( "ApiDemos")の断片例もあります。それらをチェックしてください。 –
ええ、私はそれを得ましたが、これは私が求めているものではありません。私は断片で作業して、それがどのように機能するのか知っています。私が知りたくないことは、次のとおりです。最初のタブにいるとし、ユーザーがボタンをクリックしたときに別のフラグメントを呼び出したとします。2番目のステップでは、タブを2番目のステップに変更しました。それは2番目のタブの断片を右にしていますか?しかし、私はまた、最初のタブで変更されたものを維持したい。したがって、この方法で、私はちょうど前のタブで以前に変更されたコンテンツを保持しません。何か案が ? – osayilgan