【问题标题】:How can I pass values between 2 fragments?如何在 2 个片段之间传递值?
【发布时间】:2020-07-15 20:31:30
【问题描述】:

我想将一个片段的值发送到另一个片段。我的代码:

片段 1:

    int finishedLevels;
    int skippedLevels;
    int usedHints;
    int failedLevels;

    public static final String FINISHED_LEVELS = "com.example.rexan_snerficonquiz.Quiz_Fragment.FINISHED_LEVELS";
    public static final String SKIPPED_LEVELS = "com.example.rexan_snerficonquiz.Quiz_Fragment.SKIPPED_LEVELS";
    public static final String FAILED_LEVELS = "com.example.rexan_snerficonquiz.Quiz_Fragment.FAILED_LEVELS";
    public static final String USED_HINTS = "com.example.rexan_snerficonquiz.Quiz_Fragment.USED_HINTS";



    public void openActifity2(){
        Intent intent = new Intent(getActivity().getApplication(), Quiz_Fragment.class);
        intent.putExtra(FINISHED_LEVELS, finishedLevels);
        intent.putExtra(FAILED_LEVELS, failedLevels);
        intent.putExtra(USED_HINTS, usedHints);
        intent.putExtra(SKIPPED_LEVELS, skippedLevels);
        startActivity(intent);
    }

片段 2:

import static com.example.rexan_snerficonquiz.Quiz_Fragment.FAILED_LEVELS;
import static com.example.rexan_snerficonquiz.Quiz_Fragment.FINISHED_LEVELS;
import static com.example.rexan_snerficonquiz.Quiz_Fragment.SKIPPED_LEVELS;
import static com.example.rexan_snerficonquiz.Quiz_Fragment.USED_HINTS;



    int finishedLevels = getActivity().getIntent().getIntExtra(FINISHED_LEVELS,0);
    int failedLevels = getActivity().getIntent().getIntExtra(FAILED_LEVELS, 0);
    int skippedLevels = getActivity().getIntent().getIntExtra(SKIPPED_LEVELS, 0);
    int usedHints = getActivity().getIntent().getIntExtra(USED_HINTS, 0);

我认为我发现了一个问题

    Intent intent = new Intent(getActivity().getApplication(), Quiz_Fragment.class);

因为源和目标是必需的。但是因为它在一个片段中,所以我必须在上课之前写“getActivity().getApplication()”。 所以我用

    Intent intent = new Intent(getActivity().getApplication(), Quiz_Fragment.class,getActivity().getApplication(),Fragment_score.class);

,但这被标记为错误。这也是:

    Intent intent = new Intent(getActivity().getApplication(), Quiz_Fragment.class,Fragment_score.class);

上面的代码“我认为我看到了一个问题”没有被标记为错误。但是当我使用应用程序并且值发生变化时,应用程序崩溃了。 错误代码是:

E/AndroidRuntime: 致命异常: main 进程:com.example.rexan_snerficonquiz,PID:18240 android.content.ActivityNotFoundException:无法找到显式活动类 {com.example.rexan_snerficonquiz/com.example.rexan_snerficonquiz.Fragment_score};您是否在 AndroidManifest.xml 中声明了此活动? 在 android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:2065) 在 android.app.Instrumentation.execStartActivity(Instrumentation.java:1727) 在 android.app.Activity.startActivityForResult(Activity.java:5314) 在 androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:676) 在 androidx.core.app.ActivityCompat.startActivityForResult(ActivityCompat.java:234) 在 androidx.fragment.app.FragmentActivity.startActivityFromFragment(FragmentActivity.java:791) 在 androidx.fragment.app.FragmentActivity$HostCallbacks.onStartActivityFromFragment(FragmentActivity.java:933) 在 androidx.fragment.app.Fragment.startActivity(Fragment.java:1185) 在 androidx.fragment.app.Fragment.startActivity(Fragment.java:1173) 在 com.example.rexan_snerficonquiz.Quiz_Fragment.openActifity2(Quiz_Fragment.java:251) 在 com.example.rexan_snerficonquiz.Quiz_Fragment$2.onClick(Quiz_Fragment.java:101) 在 android.view.View.performClick(View.java:7438) 在 android.view.View.performClickInternal(View.java:7415) 在 android.view.View.access$3600(View.java:810) 在 android.view.View$PerformClick.run(View.java:28286) 在 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)

但这在我看来没有任何意义。 如果我改变了

    Intent intent = new Intent(getActivity().getApplication(), Quiz_Fragment.class);

(来源)到

    Intent intent = new Intent(getActivity().getApplication(), Framgent_score.class);

(目标)错误代码将“Quiz_Fragment”的所有内容更改为“Fragment_score”。

【问题讨论】:

  • 显示您的清单。 Intent 用于活动,而不是片段

标签: java android android-studio android-fragments


【解决方案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();

在片段 2 上

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

【讨论】:

    【解决方案2】:

    Activity 和 Fragment 是两个不同的东西,你应该了解它们的区别,Intent 不能用于启动 Fragment,而 Fragment Manager 应该可以解决问题

    FragmentManager fm= getSupportFragmentManager();
    FragmentTransaction ft= fm.begin transaction();
    ft.add(android.R.Id.content, yourFragment).commit();
    

    然后您可以使用单例类在两个片段之间传递数据。单例类的示例:

    public class mysingleton{
       private static mysingleton instance= new mysingleton();
    
        private mysingleton() {}
    
       private mysingleton getInstance(){
             return instance;
       }
       // generate getter and setter for whatever data your 
        passing
    }
    

    注意:单例类可能会导致内存泄漏,因此请阅读如何防止这种情况。

    【讨论】:

      猜你喜欢
      • 2017-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多