5

由於TabActivity已被棄用,我需要找到一種方法來處理Fragments。在我知道它是如何工作之前,我曾與Fragments合作過,但我需要一個指南來創建帶有FragmentActivities的標籤主機。我在互聯網上發現了幾個例子,它們都是關於將標籤放入容器中的。使用FragmentActivity和Fragments替換TabActivity

我想要的是爲每個選項卡放置FragmentActivities。因爲在我的應用程序中,我將使用4個選項卡,並且每個選項卡都有非常複雜的內容。因此,我需要爲每個選項卡分配一個FragmentActivity來管理碎片,這些碎片將放在單獨的容器中的每個選項卡下。

SOLUTION:

後的答案和網上我結束了一個解決方案上進行搜索。根據我找到的解決方案,我在選項卡主機下的每個選項卡上都保留了對分離堆棧中的碎片進行跟蹤。 Here是我的GitHub存儲庫,我爲此問題創建了一個小示例應用程序。

回答

9

由於TabActivity已被棄用,我需要找到一種方法來處理碎片。

如果你不想使用TabActivity - 忘記把FragmentActivities到選項卡的內容。

我提醒您,您可以使用TabWidget而不使用TabActivity。所以你可以試試這個解決方案:

  1. 創建一個FragmentActivity
  2. TabWidget分成FragmentActivity的佈局。製作TabWidget的內容的高度= 0.
  3. TabWidget下的XML聲明你的容器Fragment s(FrameLayout例如)。
  4. FragmentActivity只處理選擇哪個選項卡(TabHost.OnTabChangeListener)並將所需的Fragment放入容器中。
  5. 將程序邏輯(在較早的不同活動中)放入不同的片段中。

或者你可以創建FragmentActivityTabWidget,並沒有切換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。 只有OnCreateViewonDestroyView片段的方法將一次又一次地調用,而你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

+0

Thx作爲答案,但如果我將片段而不是活動放入標籤中,則會出現另一個問題。例如,在第一個選項卡中,我想用大小寫替換容器中的另一個片段,用戶單擊一個按鈕,然後如果我更改選項卡轉到第二個片段,這將替換以前的片段。所以在這種情況下,我再次轉到第一個選項卡,它會再次創建片段,我將無法看到上一頁。你有什麼想法如何擺脫它? – osayilgan

+0

我編輯了我的答案。看看這個。樣本中還有片段示例(「ApiDemos」)。去看一下。 –

+0

是的,我知道了,但這不是我要求的。我曾與碎片工作,我知道它是如何工作的。我不知道的是:假設我們在第一個標籤中,並且在用戶點擊按鈕的情況下我調用了另一個片段,第二步我將標籤更改爲第二個,因此這裏將替換數據在它的第二個標籤的片段正確嗎?但是我也想保留第一個標籤中已經改變的東西。所以以這種方式如果我只是替換onTabChange上的片段,這將不會保留先前選項卡中以前更改過的內容。任何想法 ? – osayilgan

1

將標籤內容放入單獨的活動的方法已被棄用,因爲現在我們有Fragment框架。您應該將選項卡的複雜內容放入片段中,並在用戶選擇選項卡時交換這些片段。

對此的推薦解決方案是使用帶有Tab導航的ActionBar,而不是使用TabHost小部件。

+0

感謝您的回答,我對使用它有一些擔憂。例如,如果我爲第一個選項卡放置了一個片段,我將需要在同一個選項卡中進行導航,並且據我所知,我們只爲整個選項卡和片段使用了一個容器,因此,在將一些片段添加到第一個選項卡中的主容器,我將它更改爲第二個選項卡,因此當我這樣做時,這將刪除我創建並放入第一個選項卡內的容器中的所有片段,並將第二個片段放到主容器, – osayilgan

+0

這意味着我在第一個選項卡中創建的所有數據將被刪除並替換爲第二個片段?如果我回到第一個標籤怎麼辦? 我會重新創建它嗎? – osayilgan

相關問題