由於TabActivity已被棄用,我需要找到一種方法來處理碎片。
如果你不想使用TabActivity
- 忘記把FragmentActivities
到選項卡的內容。
我提醒您,您可以使用TabWidget
而不使用TabActivity
。所以你可以試試這個解決方案:
- 創建一個
FragmentActivity
。
- 把
TabWidget
分成FragmentActivity
的佈局。製作TabWidget
的內容的高度= 0.
- 在
TabWidget
下的XML聲明你的容器Fragment
s(FrameLayout
例如)。
- 在
FragmentActivity
只處理選擇哪個選項卡(TabHost.OnTabChangeListener
)並將所需的Fragment
放入容器中。
- 將程序邏輯(在較早的不同活動中)放入不同的片段中。
或者你可以創建FragmentActivity
與TabWidget
,並沒有切換Fragment
是你可以直接把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
的同時生活。看看fragments lifecycle。 只有OnCreateView
和onDestroyView
片段的方法將一次又一次地調用,而你replace
一個片段到另一個。
Fragments也有他們的onSaveInstanceState
方法,您可以保存片段的狀態。例如:用戶在fragment1的editText中鍵入他的名字。如果你想保留這個數據(名稱字符串),而用戶發現其他片段,你應該在片段1的onSaveInstanceState
方法
1.save名字符串
2成片段1的onCreateView
方法檢查savedInstanceState包,如果它不是空 - 填寫的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
方法 - 系統將嘗試保存片段(與所有輸入數據)的狀態。 link to description
Thx作爲答案,但如果我將片段而不是活動放入標籤中,則會出現另一個問題。例如,在第一個選項卡中,我想用大小寫替換容器中的另一個片段,用戶單擊一個按鈕,然後如果我更改選項卡轉到第二個片段,這將替換以前的片段。所以在這種情況下,我再次轉到第一個選項卡,它會再次創建片段,我將無法看到上一頁。你有什麼想法如何擺脫它? – osayilgan
我編輯了我的答案。看看這個。樣本中還有片段示例(「ApiDemos」)。去看一下。 –
是的,我知道了,但這不是我要求的。我曾與碎片工作,我知道它是如何工作的。我不知道的是:假設我們在第一個標籤中,並且在用戶點擊按鈕的情況下我調用了另一個片段,第二步我將標籤更改爲第二個,因此這裏將替換數據在它的第二個標籤的片段正確嗎?但是我也想保留第一個標籤中已經改變的東西。所以以這種方式如果我只是替換onTabChange上的片段,這將不會保留先前選項卡中以前更改過的內容。任何想法 ? – osayilgan