【问题标题】:How can I pass values from 1 fragment to another with Bundle()?如何使用 Bundle() 将值从 1 个片段传递到另一个片段?
【发布时间】:2020-07-16 08:39:06
【问题描述】:

我发现这段代码可以将数据从一个片段传递到另一个片段:

片段 1:

    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    Fragment2 fragment2 = new Fragment2();
    Bundle bundle = new Bundle();
    bundle.putString("data", data);
    fragmentTransaction.replace(R.id.fragment_container, fragment2);
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();

片段 2:

   Bundle bundle = getArguments();
   assert bundle != null;
   String data = bundle.getString("data");

但我不想更改片段。所以我删除了它的一部分。但它不起作用。这是我的代码:

片段 1:

public void openActifity2(){
    Fragment_score fragment_score = new Fragment_score();
    Bundle bundle = new Bundle();
    bundle.putInt("FINISHED_LEVELS", finishedLevels);
    bundle.putInt("FAILED_LEVELS", failedLevels);
    bundle.putInt("SKIPPED_LEVELS", skippedLevels);
    bundle.putInt("USED_HINTS", usedHints);
    fragment_score.setArguments(bundle);
}

片段 2:

    Bundle bundle = getArguments();
    int finishedLevels = bundle.getInt("FINISHED_LEVELS");
    int failedLevels = bundle.getInt("FINISHED_LEVELS");
    int skippedLevels = bundle.getInt("FINISHED_LEVELS");
    int usedHints = bundle.getInt("FINISHED_LEVELS");

我必须使用我在互联网上找到的代码还是我的版本也可以使用? 打开第二个片段时出现此错误:

E/AndroidRuntime: 致命异常: main 进程:com.example.rexan_snerficonquiz,PID:20931 java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“int android.os.Bundle.getInt(java.lang.String)” 在 com.example.rexan_snerficonquiz.Fragment_score.onCreateView(Fragment_score.java:26) 在 androidx.fragment.app.Fragment.performCreateView(Fragment.java:2600) 在 androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:881) 在 androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238) 在 androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303) 在 androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439) 在 androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2079) 在 androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1869) 在 androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1824) 在 androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727) 在 androidx.fragment.app.FragmentManagerImpl$2.run(FragmentManagerImpl.java:150) 在 android.os.Handler.handleCallback(Handler.java:938) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:223) 在 android.app.ActivityThread.main(ActivityThread.java:7523) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:941)

【问题讨论】:

  • 如果您使用 MVVM 设计模式,您可以轻松地使用视图模型在片段之间共享数据

标签: java android android-fragments


【解决方案1】:

为了避免出错,试试这个

Bundle bundle = getArguments();
if(bundle != null){
    int finishedLevels = bundle.getInt("FINISHED_LEVELS", "DEFAULT_VALUE");
    int failedLevels = bundle.getInt("FINISHED_LEVELS", "DEFAULT_VALUE");
    int skippedLevels = bundle.getInt("FINISHED_LEVELS", "DEFAULT_VALUE");
    int usedHints = bundle.getInt("FINISHED_LEVELS", "DEFAULT_VALUE");
}

根据您的cmets,您可以在onOptionsItemSelected方法中更改片段

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    int id = item.getItemId();

    if (id == R.id.action_1) {
        // add your action here that you want
        return true;
    }else if (id==R.id.action_2) {
         // add your action here that you want
        return true;
    }

    return super.onOptionsItemSelected(item);
} 

【讨论】:

  • 我用侧边栏菜单打开第二个片段。
  • 我的侧边栏菜单:youtu.be/USenYOBJw9Y 第 1/4 部分。
【解决方案2】:

如果您更改片段,那么您的代码将可以正常工作。但是,如果您不想更改片段而不是 1) int finishedLevels = bundle.getInt("FINISHED_LEVELS", 0); 或 2) 在 Fragment 1 中使用静态全局变量 public static int finishedLevels = 0; 而不是捆绑包,然后只需在 Fragment 中获取它们的值2 使用类名引用。 注意:如果您不想更改片段并希望 片段 2 中的值,那么我会推荐 静态变量

【讨论】:

    猜你喜欢
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多