简体   繁体   English

如何使用 Bundle() 将值从 1 个片段传递到另一个片段?

[英]How can I pass values from 1 fragment to another with Bundle()?

I found this code to pass the data from a fragment to another:我发现这段代码可以将数据从一个片段传递到另一个片段:

Fragment 1:片段 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();

Fragment 2:片段 2:

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

But I dont want to change the fragment.但我不想改变片段。 So I removed parts of it.所以我删除了它的一部分。 But it doesnt work.但它不起作用。 Here my code:这是我的代码:

Fragment 1:片段 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);
}

Fragment 2:片段 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");

Do I have to use the code I found on the internet or does my version work too?我必须使用我在互联网上找到的代码还是我的版本也可以工作? I get this error when I open the second fragment:打开第二个片段时出现此错误:

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.rexan_snerficonquiz, PID: 20931 java.lang.NullPointerException: Attempt to invoke virtual method 'int android.os.Bundle.getInt(java.lang.String)' on a null object reference at com.example.rexan_snerficonquiz.Fragment_score.onCreateView(Fragment_score.java:26) at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2600) at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:881) at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238) at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303) a E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.rexan_snerficonquiz, PID: 20931 java.lang.NullPointerException: Attempt to invoke virtual method 'int android.os.Bundle.getInt(java.lang.String)' on a null object reference at com.example.rexan_snerficonquiz.Fragment_score.onCreateView(Fragment_score.java:26) at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2600) at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java :881) at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238) at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303) a t androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439) at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2079) at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1869) at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1824) at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727) at androidx.fragment.app.FragmentManagerImpl$2.run(FragmentManagerImpl.java:150) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.l t androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439) at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2079) at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1869 ) at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1824) at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727) at androidx.fragment.app.FragmentManagerImpl$2.run(FragmentManagerImpl.java :150) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.l oop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7523) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:941) oop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7523) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller. run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:941)

in order to avoid getting the error, try this为了避免出现错误,试试这个

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");
}

Based on your comments, you can change fragment in onOptionsItemSelected method根据您的评论,您可以在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);
} 

If you change the fragments than your code will be working fine.如果您更改片段,那么您的代码将可以正常工作。 But if you don't want to change fragments than 1) int finishedLevels = bundle.getInt("FINISHED_LEVELS", 0);但是如果你不想改变片段而不是 1) int finishedLevels = bundle.getInt("FINISHED_LEVELS", 0); OR 2) Instead of bundle use static global variables public static int finishedLevels = 0;或 2) 代替捆绑使用 static 全局变量public static int finishedLevels = 0; in Fragment 1 and then simply get their value in Fragment 2 using class name reference.片段 1中,然后使用 class 名称引用简单地在片段 2中获取它们的值。 Note: If you don't want to change the fragment and want values in Fragment 2 then i would recommend the static variables注意:如果您不想更改片段并想要片段 2中的值,那么我会推荐static 变量

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 我无法将带有捆绑的ArrayList从一个片段放到另一个片段中 - I can't put a ArrayList with a bundle from a fragment into another fragment 如何将捆绑从一个活动传递到放置在另一个活动中的片段? - how to pass bundle from an activity to a fragment which is placed in another activity? 我可以将接口传递给Fragment的捆绑包吗? - Can I pass an interface to bundle of a Fragment? 如何使用捆绑将数据从片段传递到活动 - How to pass data from fragment to activity with bundle 如何将带有ArrayList的捆绑包从片段传递到活动 - How to pass bundle with ArrayList from Fragment to Activity 无法通过 navController 的 setGraph 中的包将数据从一个片段传递到另一个片段 - Can't pass data from one fragment to another through bundle in setGraph of navController 如何在ViewPager中将一个片段的值传递给另一个片段? - How to pass values from one Fragment to another in a ViewPager? 无法使用Bundle将字符串从一个片段传递到另一个片段 - Not able to pass string from one fragment to another using Bundle 如何将捆绑数据从一个片段获取到另一个片段? - How to get bundle data from one fragment to another fragment? 我如何将计时器从一个片段传递到另一个片段? - How would i pass a timer from one fragment to another?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM