2014-12-02 54 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 

    } 
相关问题