多个反向堆栈被添加到片段事务中

时间:2014-12-02 13:40:32

标签: android android-fragments

在我的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;

现在,一旦用户点击标识为action_add_box两次的操作菜单,他就必须向后击两次以关闭不期望的片段。

有可能避免这种情况吗?

例如,一旦用户点击操作菜单,如果片段已经对用户可见,则不执行任何操作?

还有一个问题,片段中有一些EditTexts,一旦用户完成,我将提交数据并关闭片段,但是用户可能需要再次打开片段,我想保留EditText的值最后由用户输入。现在,我在分离片段时保存值,并在使用savedInstanceState创建时重置值。

同样为每个动作命令创建一个新的片段实例是浪费内存,我想知道我是否只能使用一个片段实例,那么我可能不需要手动保存/重置这些值吗?

1 个答案:

答案 0 :(得分:0)

你可以使用单例模式来保留一个片段实例,例如:

    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

   }