【问题标题】:onSaveInstanceState causes the App to crashonSaveInstanceState 导致 App 崩溃
【发布时间】:2014-11-02 19:50:52
【问题描述】:

我有一个有一个主要活动的应用程序,这个活动有5个actionTabs,每个actionTab包含一个fragment,所以我也有5个fragments

第一个fragment 只显示单词“hello”。

在第二个fragment中,它只是显示一些textviews来指示正在调用活动生命周期的哪个回调。

第三个fragment,在其布局中,包含一个tablelayout,有3行,每行有一个imagetextview和一个edittext。当访问这个fragment 包含在这个tab 中时,当我旋转设备时,应用程序不会崩溃。

只有当我访问第四个或第五个tab并旋转包含以下内容的设备时,应用程序才会崩溃:

第四个和第五个tab分别有三个LinearLayout和三个relative layout。第四个fragment的主要linearlayout是垂直方向,嵌套的三个linearlayouts是水平方向,每一个都包含imageviewtextviewedittext

第五个fragemnt与第四个几乎相同,但不是linearlayouts,而是relativlayout

注意事项

第二个fragmentonSavedInstance的方法,当访问第四个或第五个fragment时App崩溃,logcat抱怨onSavedInstance并产生如下贴文。

我想知道为什么当我访问第四个fragment或第五个并旋转设备时应用程序崩溃?

LogCat

11-02 20:48:29.699: E/AndroidRuntime(22282): FATAL EXCEPTION: main

11-02 20:48:29.699:E/AndroidRuntime(22282):进程:com.example.viewpagerwithactiontabstest00,PID:22282 11-02 20:48:29.699: E/AndroidRuntime(22282): java.lang.NullPointerException 11-02 20:48:29.699: E/AndroidRuntime(22282): 在 com.example.viewpagerwithactiontabstest00.Aufgabe_2.onSaveInstanceState(Aufgabe_2.java:142) 11-02 20:48:29.699: E/AndroidRuntime(22282): 在 android.support.v4.app.Fragment.performSaveInstanceState(Fragment.java:1647) 11-02 20:48:29.699: E/AndroidRuntime(22282): 在 android.support.v4.app.FragmentManagerImpl.saveFragmentBasicState(FragmentManager.java:1610)

onSavedInstance() 方法

@Override
public void onSaveInstanceState(Bundle outState) {
    // TODO Auto-generated method stub
    super.onSaveInstanceState(outState);

    outState.putString("TEXT", tv_00.getText().toString());
}

【问题讨论】:

  • 看来tv00null
  • 但是为什么我在第四或第五个片段时为空,否则不为空?
  • 你是这个星球上唯一能回答这个问题的人,因为没有人知道你在哪里初始化tv00
  • tv_00 在第二个片段中初始化并在第二个片段布局中声明
  • tv_00 UI 元素在 xml 文件中是否具有分配给它的唯一值?

标签: android android-fragments activity-lifecycle


【解决方案1】:

您的片段可能已创建,但尚未调用 onCreateView()。在这种情况下,onSaveInstanceState() 中还没有这个小部件。

您可以考虑完全删除此onSaveInstanceState(),使用android:freezesText 来安排以确保此文本视图在配置更改时保留其文本。

【讨论】:

  • 我尝试了您提供的解决方案,但应用程序仍然崩溃。我真的不知道为什么只有第 4 个和第 5 个碎片会导致崩溃
  • 如果用户将id 明确分配给小部件,系统是否不能保证小部件的状态保持不变?如果附加了id,那么 freezesText 仍然是必需品吗?
  • @LetsAmrIt:“我尝试了您提供的解决方案,但应用程序仍然崩溃”——如果您没有 onSaveInstanceState(),它肯定不会在 onSaveInstanceState() 中崩溃。
  • @harikris:“如果用户明确地为小部件分配 id,系统不保证小部件的状态保持不变吗?” -- 默认情况下只有用户可变状态。所以EditText 的文本被保存到Bundle,而不是TextViewandroid:freezesText 赋予 TextViewEditText 相同的保存内容能力。而且,当然,我假设这里确实需要保存这个状态——可以不理会作为静态标签的TextView
猜你喜欢
  • 2014-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多