[英]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.