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