2014-12-02 72 views
0

在我的android應用程序中,片段將通過某個操作(例如操作欄菜單)添加到活動中。將多個後臺堆棧添加到片段事務

這是我補充的片段代碼:

 case R.id.action_add_box: 
      FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
      ft.replace(R.id.place, BoxEditFragment.newInstance(null, null)); 
      ft.addToBackStack(null); 
      ft.commit(); 
      break; 

現在,一旦用戶擊中ID action_add_box兩次的操作菜單,然後他必須打回兩次,關閉這不是片段預期。

可以避免這種情況嗎?

例如,一旦用戶點擊操作菜單,如果片段已經對用戶可見,則什麼也不做?

還有一個問題,片段中有一些EditTexts,一旦用戶完成,我將提交數據並關閉片段,但用戶可能需要再次打開片段,並且我想保留片段的值最後由用戶輸入的EditText。現在我保存片段分離時的值,並在使用savedInstanceState創建時重置該值。

也可以爲每動作指示片段的新實例浪費內存,我不知道如果我可以只用一個片段實例,然後我可能不需要保存/手動重置價值?

+0

可能是店ft.commit()結果,並期待在這個方法http://developer.android.com/reference/android/app/FragmentManager.html#popBackStack(int,int) – 2014-12-02 13:55:46

回答

0

可以使用單parttern保持片段的一個實例如:

public class MyFragment extends Fragment{ 

     public static MyFragment oneInstance = null ; 


     private MyFragment(){ 
     super(); 
     } 

     public static MyFragment getInstance(){ 
     if (oneInstance == null){ 
      synchronized (MyFragment.class){ 
      if (oneInstance == null){ 
       oneInstance = new MyFragment(); 
      } 
      } 
     return oneInstance ; 

     } 

} 

上面的代碼也線程安全

MyFragment frag= (MyFragment)getFragmentManager().findFragmentById(R.id.your_fragment_layout); 


    if(frag == null){ 

     // fragment is not visible 
    }else{ 

     // fragment is visible 

    }