Поскольку TabActivity устарела, мне нужно найти способ сделать это с помощью фрагментов.
Если вы не хотите использовать TabActivity
- забудьте о том, чтобы вставлять FragmentActivities
в содержимое вкладки.
Напоминаю, что можно использовать TabWidget
без TabActivity
. Итак, вы можете попробовать это решение:
- Создайте только один файл
FragmentActivity
.
- Поместите
TabWidget
в макет FragmentActivity
. Сделайте высоту содержимого TabWidget
= 0.
- Под
TabWidget
в XML объявите контейнер для вас Fragment
s (например, FrameLayout
).
- В
FragmentActivity
просто укажите, какая вкладка выбрана (TabHost.OnTabChangeListener
), и поместите нужную Fragment
в контейнер.
- Поместите логику программы (которая была ранее в разных действиях) в разные фрагменты.
Или вы можете создать FragmentActivity
с TabWidget
, и вместо переключения 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
выполняете переход от одного фрагмента к другому.
Также у Фрагментов есть свой метод onSaveInstanceState
, в котором вы можете сохранить состояние вашего фрагмента. Например: пользователь ввел свое имя в editText фрагмента1. Если вы хотите сохранить эти данные (строку имени), пока пользователь обнаруживает другие фрагменты, вам следует
1. сохранить строку имени в методе onSaveInstanceState
фрагмента1
2. в методе onCreateView
фрагмента1 проверить пакет saveInstanceState, если он не нулевой - заполнить 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());
}
}
Вы можете проверить данные перед сохранением. Надеюсь, теперь моя точка зрения ясна.
Также если вы вызовете setRetainInstance(true)
в методе onCreateView()
вашего fragment
- система попытается сохранить состояние фрагмента (со всеми входными данными). ссылка на описание
person
ashakirov
schedule
10.09.2012