Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 多个backbackback被添加到片段事务中_Android_Android Fragments - Fatal编程技术网

Android 多个backbackback被添加到片段事务中

Android 多个backbackback被添加到片段事务中,android,android-fragments,Android,Android Fragments,在我的android应用程序中,某个动作(例如,动作栏菜单)会将一个片段添加到活动中 这是我添加片段的代码: case R.id.action_add_box: FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.replace(R.id.place, BoxEditFragment.newInstance(null, null));

在我的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\u add\u box
点击action菜单两次,那么他必须点击后面两次来关闭不期望的片段

有可能避免这种情况吗

例如,一旦用户点击“操作”菜单,如果该片段已经对用户可见,则什么也不做

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


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

您可以使用singleton 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

   }
可能是store ft.commit()结果并查看此方法,int)