我可以從活動開始片段。然而,我擔心我的實施可能出現的問題。從活動開始片段
我有兩個片段,FragmentA
和FragmentB
我有3個活動課,Activity1
,Activity2
,ResultActivity
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;
......
......
}
}
^我怎麼叫通過意圖FragmentA
和FragmentB
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
我已經打過電話Activity1
從FragmentA
這樣,但我實在不明白行爲上的差異或性能
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
等
這看起來太複雜了。當您嘗試返回已經分離或刪除的片段時,您可能會收到空指針異常... – StoneBird 2014-11-06 05:14:28
是的,你說得對。我的方法不必要的複雜性主要是由於不瞭解/理解片段的生命週期以及用於管理片段的工具。感謝您的反饋 – Mcorv 2014-11-06 13:57:36
您可以做的是使用您提到的回調模式,讓主機活動處理所有操作,啓動新的活動或片段。那麼你的片段只是一個特定視圖的容器。使用回調模式是首選,因爲該活動具有所有'Context'的東西。 – StoneBird 2014-11-06 14:29:55