【问题标题】:Removing a fragment using its tag is not working使用其标签删除片段不起作用
【发布时间】:2016-08-19 10:52:04
【问题描述】:

我正在尝试添加,然后使用其标签删除片段。

在我的 MainActivity.java 文件中,我有以下代码:

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;

public class MainActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        fragment1 myFragment = new fragment1();
        getSupportFragmentManager().beginTransaction().add(R.id.fragment_container , myFragment , "mytag").commit() ;
       Fragment myFragment2 =  getSupportFragmentManager().findFragmentByTag("mytag");
        getSupportFragmentManager().beginTransaction().remove(myFragment2).commit();


    }
}

fragment1.java 文件只有以下代码:

public class fragment1 extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.activity_fragment1, container, false);
    }


}

但是,当我运行这个应用程序时,它一启动就崩溃,原因是

试图写入一个空对象

这意味着 findFragmentByTag 函数正在返回一个 null 对象。

我的日志:

08-19 12:59:46.605 31377-31377/com.example.first.myapplication E/AndroidRuntime: 致命异常: main 进程:com.example.first.myapplication,PID:31377 java.lang.RuntimeException:无法启动活动 组件信息{com.example.first.myapplication/com.example.first.myapplication.MainActivity}: java.lang.NullPointerException:尝试写入字段'int android.support.v4.app.Fragment.mNextAnim' 在空对象引用上 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2434) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2494) 在 android.app.ActivityThread.access$900(ActivityThread.java:157) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1356) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5527) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620) 引起:java.lang.NullPointerException:尝试写入字段 空对象上的“int android.support.v4.app.Fragment.mNextAnim” 参考 在 android.support.v4.app.BackStackRecord.run(BackStackRecord.java:770) 在 android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1677) 在 android.support.v4.app.FragmentController.execPendingActions(FragmentController.java:388) 在 android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:604) 在 android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1238) 在 android.app.Activity.performStart(Activity.java:6288) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2397) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2494) 在 android.app.ActivityThread.access$900(ActivityThread.java:157) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1356) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5527) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)

【问题讨论】:

标签: java android android-fragments


【解决方案1】:
fragmentManagerMenu.beginTransaction().add(R.id.superContainer, PersonalUsersListFragment.newInstance(userList, usersId), "PersonalUsersListFragment").addToBackStack("menuStack").commit();

并清除fragmentManagerMenu.popBackStack("menuStack", FragmentManager.POP_BACK_STACK_INCLUSIVE);

【讨论】:

    【解决方案2】:

    使用

    getSupportFragmentManager().beginTransaction().add(R.id.fragment_container , myFragment , "mytag").commitNow() ;
    

    而不是:

    getSupportFragmentManager().beginTransaction().add(R.id.fragment_container , myFragment , "mytag").commit() ;
    

    解决了这个问题,因为 commit() 是异步函数,而 commitNow 是同步函数。

    谢谢。

    【讨论】:

      【解决方案3】:

      没有更好的选择是替换片段?

      类似这样的:

      public void showSpinner(boolean show) {
          FragmentManager fragmentManager = getFragmentManager();
          if (show) {
              fragmentManager.beginTransaction().add(R.id.browse_frame_layout, new SpinnerFragment(),
                      getString(R.string.spinner_fragment))
                      .commit();
          } else {
              fragmentManager.beginTransaction()
                      .remove(fragmentManager.findFragmentByTag(getString(R.string.spinner_fragment)))
                      .commit();
          }
      }
      

      【讨论】:

      • 我想删除片段,而不是替换它。
      • 尝试 make if(when fragmenta.isAdded){ fragmentb.remove(); }
      • 我该怎么做?
      • 查看editet的答案,你需要处理的是上面的这个
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-16
      • 2018-11-09
      • 1970-01-01
      • 1970-01-01
      • 2013-09-10
      • 1970-01-01
      • 2020-07-23
      相关资源
      最近更新 更多