gpt4 book ai didi

java - 无法恢复嵌套 fragment 状态

转载 作者:行者123 更新时间:2023-12-02 03:11:33 24 4
gpt4 key购买 nike

我在恢复嵌套 fragment 的状态时遇到问题。这是层次结构:

主 Activity

----> AlarmOverviewFragment(并不真正保存任何重要数据)

--------> AlarmFragment(保存数据)

我遇到的问题是,当我最小化应用程序(按主页按钮)然后重新打开应用程序时,每次尝试从存储为 Fragment 之一的数组中获取数据时,它都会崩溃onCreateView() 中的实例变量。

令人沮丧的是,我将实例变量保存在 onSaveInstanceState() 中,但 savedInstanceStateonCreateView() 中始终为 null 、onCreate()onActivityCreated()

显然我在这里错过了一些巨大的东西,因为我已经尝试了在 stackoverflow 上找到的许多解决方案,但都无济于事。以下是一些相关代码:

保存实例数据:

@Override
public void onSaveInstanceState(Bundle outState) {
outState.putInt("hour", this.hour);
outState.putInt("window", this.window);
outState.putInt("minutes", this.minutes);
outState.putBooleanArray("days", this.days);
super.onSaveInstanceState(outState);
}

尝试恢复数据失败

@Override
public void onCreate(Bundle savedInstanceState) {

if (savedInstanceState != null) {
/* Never happens */
hour = savedInstanceState.getInt("hour");
window = savedInstanceState.getInt("window");
minutes = savedInstanceState.getInt("minutes");
days = savedInstanceState.getBooleanArray("days");
}
super.onCreate(savedInstanceState);
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
if (savedInstanceState != null) {
/* Also never happens */
}
super.onActivityCreated(savedInstanceState);
}

为了以防万一这有帮助,这里是堆栈跟踪:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: group12.wakemeup, PID: 22756
java.lang.RuntimeException: Unable to resume activity {group12.wakemeup/group12.wakemeup.MainActivity}: java.lang.NullPointerException: Attempt to read from null array
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3121)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3152)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1400)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5525)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
Caused by: java.lang.NullPointerException: Attempt to read from null array
at group12.wakemeup.AlarmFragment.onCreateView(AlarmFragment.java:113)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:2087)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1113)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1295)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1682)
at android.support.v4.app.FragmentController.execPendingActions(FragmentController.java:388)
at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:607)
at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:181)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1237)
at android.app.Activity.performStart(Activity.java:6288)
at android.app.Activity.performRestart(Activity.java:6334)
at android.app.Activity.performResume(Activity.java:6339)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3110)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3152) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1400) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5525) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620) 

编辑

额外信息

每个 AlarmFragment 都是动态添加的,并通过 View.generateViewId() 赋予唯一的 ID,因此我不确定如何在 中保存每个 fragment 主要 Activity 。另外值得一提的是,我确实使用FragmentPagerAdapter来处理选项卡/滑动(此应用程序中还有其他概述 fragment ,但我将它们排除在外,因为它们不会引起我的注意)问题)。我听说有一种方法可以使用 ViewPager 来保存状态,也许还有一种带有 FragmentPagerAdapter 的方法?

最佳答案

由于您的问题似乎从一开始就不同,实际上您不需要每次都在 onNewIntent 内重新创建 fragment 。您可以这样做:

@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if ("some_action".equals(intent.getAction())) {
//your action, in your case create and assign fragment

//remove the action
intent.setAction(null);
}
}

关于java - 无法恢复嵌套 fragment 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40966762/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com