簡體   English   中英

如何在 2 個片段之間傳遞值?

[英]How can I pass values between 2 fragments?

我想將一個片段的值發送到另一個片段。 我的代碼:

片段 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);

因為源和目標是必需的。 但是因為它在一個片段中,所以我必須在 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: FATAL EXCEPTION: main Process: com.example.rexan_snerficonquiz, PID: 18240 android.content.ActivityNotFoundException: Unable to find explicit activity class {com.example.rexan_snerficonquiz/com.example.rexan_snerficonquiz.Fragment_score}; 您是否在 AndroidManifest.xml 中聲明了此活動? at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:2065) at android.app.Instrumentation.execStartActivity(Instrumentation.java:1727) at android.app.Activity.startActivityForResult(Activity.java:5314) at androidx.fragment. app.FragmentActivity.startActivityForResult(FragmentActivity.java:676) at androidx.core.app.ActivityCompat.startActivityForResult(ActivityCompat.java:234) at androidx.fragment.app.FragmentActivity.startActivityFromFragment(FragmentActivity.java:791) at 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) at com.example.rexan_snerficonquiz.Quiz_Fragment.openActifity2(Quiz_Fragment.java:251) at com.example.rexan_snerficonquiz.Quiz_Fragment$2.onClick(Quiz_Fragment.java:101 ) at android.view.View.performClick(View.java:7438) at android.view.View.performClickInternal(View.java:7415) at android.view.View.access$3600(View.java:810) at android. view.View$PerformClick.run(View.java:28286) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessa ge(Handler.java:99) at android.os.Looper.loop(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)

但這在我看來沒有任何意義。 如果我改變

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

(來源)到

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

(目標)錯誤代碼將“Quiz_Fragment”的所有內容更改為“Fragment_score”。

你可以試試這個

在片段 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");

Activity 和 Fragment 是兩個不同的東西,您應該了解它們的區別,Intent 不能用於啟動 Fragment,而 Fragment Manager 應該可以解決問題

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

然后,您可以使用 singleton class 在兩個片段之間傳遞數據。 singleton class 的示例:

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
}

注意:singleton 類可能導致 memory 泄漏,因此請閱讀如何防止這種情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM