1

我可以從活動開始片段。然而,我擔心我的實施可能出現的問題。從活動開始片段

我有兩個片段,FragmentAFragmentB 我有3個活動課,Activity1Activity2ResultActivity

public class NavigationTabs extends FragmentActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.simple_tabs_2); 

    FragmentStatePagerAdapter adapter = new MyTabs(getSupportFragmentManager()); 
    .... 
    .... 
} 

static class MyTabs extends FragmentStatePagerAdapter { 
    public MyTabs(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     switch(position) 
     { 
       case 0: 

        FragmentA FragA = new FragmentA(); 
        return FragA; 

       case 1: 

        FragmentB FragB = new FragmentB(); 
        return FragB; 
     ...... 
     ...... 
     } 
    } 

^我怎麼叫通過意圖FragmentAFragmentB

FragmentA開始Activity1

Intent intent = new Intent(getActivity(), Activity1.class); 
    startActivity(intent); 

Activity1然後通過一個計數器的結果,以ResultActivity

ResultActivity開始(或返回)FragmentA和經由的onClick設置SharedPreferences像經由意圖這個

public void onClick(View v) { 
    if(v.getId()== R.id.button_1){ 
     SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); 
     Editor edit = sp.edit(); 
     edit.putInt(passedSavePref, counter); 
     edit.commit(); 

     finish(); 
} 
} 

FragmentB開始Activity2

Intent intent = new Intent(getActivity(), Activity2.class); 
    startActivity(intent); 

Activity2然後通過一個計數器的結果ResultActivity

ResultActivity開始(返回)FragmentB,並通過設置的onClick像SharedPreferences這

public void onClick(View v) { 
    if(v.getId()== R.id.button_1){ 
     SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); 
     Editor edit = sp.edit(); 
     edit.putInt(passedSavePref, counter); 
     edit.commit(); 

     finish(); 
} 
} 

這所有的作品我的需要。 GC似乎很好,它釋放和分配內存。

ResultActivty返回正確的Fragment,並正確設置SavedPreferences。

然而這似乎很不好實現。 對於初學者,同時通過我讀過其他問題搜索,「不要直接從片段開始的活動」的海報也與這裏的正確實施https://developer.android.com/guide/components/fragments.html#EventCallbacks

我已經打過電話Activity1FragmentA這樣,但我實在不明白行爲上的差異或性能

Intent intent = new Intent(getActivity(), Activity1.class); 
    startActivity(intent); 
    getActivity().getSupportFragmentManager().popBackStack(); 

所以我的問題是,我需要完成/刪除FragmentA當我開始Activity1,然後再從ResultActivity使用類似

啓動
FragmentTransaction transaction = getFragmentManager().beginTransaction(); 

在此先感謝。

編輯因此,我試圖是要麼殺/面漆/流行FragmentA,這樣我可以從ResultActivity重新啓動它。 我之所以這樣做的原因是因爲當我從ResultActivity回到FragmentA時,我的savedPreferences沒有加載。(好吧,他們正在保存和加載,但我看不到他們)

據我瞭解它的文檔,片段繼續暫停。所以調用我的loadPreferences方法onResume();加載我的SavedPreferences。

沒有標記這個作爲一個答案,因爲我沒有執行有關片段popBackStack();的任何標準的/恰當的做法FragmentTransactions

+1

這看起來太複雜了。當您嘗試返回已經分離或刪除的片段時,您可能會收到空指針異常... – StoneBird 2014-11-06 05:14:28

+0

是的,你說得對。我的方法不必要的複雜性主要是由於不瞭解/理解片段的生命週期以及用於管理片段的工具。感謝您的反饋 – Mcorv 2014-11-06 13:57:36

+0

您可以做的是使用您提到的回調模式,讓主機活動處理所有操作,啓動新的活動或片段。那麼你的片段只是一個特定視圖的容器。使用回調模式是首選,因爲該活動具有所有'Context'的東西。 – StoneBird 2014-11-06 14:29:55

回答

1
  1. 名言:「不要直接從片段開始的活動」

我看了寫這個的海報,我強烈反對。他的理由是它減少了片段的模塊性,他相信你應該推動界面回調活動。

我不同意。它不會減少模塊化,事實上它增加了它。爲什麼要實現一個抽象層來完成片段在每個實現中要做的事情?爲什麼在每個活動中重新編寫相同的代碼,何時可以在片段中模塊化?事實上,如果這違反了設計原則,那麼片段就不會有自己專門的開始活動的功能。例如,如果使用fragment.startAcitivtyForResult()啓動一個活動,則該片段直接作爲onActivityResult接收器。如果您使用活動實例直接啓動新活動,則不是這樣。

  • 你並不需要開始一個新的活動
  • 之前刪除framgents

    Android將暫停/停止你的片段,並有可能破壞他們的基本活動,以及如果需要。 Android會不斷摧毀並重新創建活動和片段,就像每次在屏幕上更改方向一樣 - 默認設置會導致您的活動和片段大規模自殺。

    這就是爲什麼像OnSaveInstanceState()這樣的函數非常重要,因爲它們讓您的活動和片段返回到保存狀態。 Android編程的一般規則是你的活動/片段應該能夠優雅地響應自發的死亡。

    +0

    這是事實。但是,即使不刪除片段,當活動返回到前一個片段時,由於活動上的系統例程,您可能會得到空指針異常。所以它會導致應用程序潛在的不穩定。 – StoneBird 2014-11-06 14:27:08

    +0

    1-從我對模塊性和抽象層的理解有限,因爲它涉及到我的實現,我同意你的看法。 感謝您的解釋。 2-「在開始新活動之前,您不需要移除framgents」 是的,我不知道。測試和日誌記錄讓我看到哪些函數在什麼時候被調用。 我沒有正式的培訓。我通過教程,試錯法,淘汰過程學習,所以像你這樣的帖子是非常有幫助的。 感謝您花時間解釋並闡明瞭這個話題。 – Mcorv 2014-11-06 14:33:55

    +1

    super.onCreate(bundle)能夠重新創建/重新連接保存到bundle的碎片/視圖,super.onSaveInstanceState()將它們放在那裏。他們在textView,光標位置,滾動狀態等等中編寫各種數據,例如文本中的數據。除非將數據放入捆綁yoruself中,否則在碎片中創建的字段在每次破壞時都會丟失,或者將參考移動到不會死的東西上。 – NameSpace 2014-11-06 15:35:48