当前位置: 首页 > 知识库问答 >
问题:

活动和片段中的自动UI配置更改处理有时会失败

龙默
2023-03-14

我写Android应用程序已经很久了,但现在我面临着一个我从未想过的问题。它是关于与配置更改相关的ActivitysFragments的android生命周期。为此,我创建了一个带有以下必要代码的小应用程序:

public class MainActivity extends FragmentActivity {

    private final String TAG = "TestFragment";
    private TestFragment fragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        FragmentManager fm = getSupportFragmentManager();
        fragment = (TestFragment) fm.findFragmentByTag(TAG);

        if (fragment == null) {
            fragment = new TestFragment();
            fm.beginTransaction().add(R.id.fragment_container, fragment, TAG).commit();
        }
    }
}

这是我的TestFragment代码。请注意,我正在调用setRetainInstance(true) onCreate方法中使用code>,以便在配置更改后不会重新创建片段。

public class TestFragment extends Fragment implements View.OnClickListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
    }

    @Override
    public View onCreateView(LayoutInflater li, ViewGroup parent, Bundle bundle) {
        View rootView = li.inflate(R.layout.fragment_test, parent, false);
        Button button = (Button) rootView.findViewById(R.id.toggleButton);

        button.setOnClickListener(this);
        return rootView;
    }

    @Override
    public void onClick(View v) {
        Button button = (Button) v;
        String enable = getString(R.string.enable);

        if(button.getText().toString().equals(enable)) {
            button.setText(getString(R.string.disable));
        } else {
            button.setText(enable);
        }
    }
}

这是我的片段使用的布局:

<LinearLayout
    ...>

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/toggleButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/enable"/>

</LinearLayout>

我的问题是,如果我旋转设备的文本按钮改变回默认值。当然,片段的视图是新创建和膨胀的,但是保存的视图实例应该被恢复。我也有一个EditText在我的布局和文本和其他属性仍然旋转后。那么,为什么按钮在默认情况下不能从Bundle中还原呢?我在开发者网站上读到过:

默认情况下,系统使用Bundle实例状态保存有关活动布局中每个视图对象的信息(例如输入到EditText对象中的文本值)。因此,如果您的活动实例被销毁并重新创建,则布局的状态将恢复到其以前的状态,而不需要任何代码。

在过去的几天里,我也读了很多答案,但我不知道它们有多真实。请不要在android:configChanges= 这是非常糟糕的做法。我希望有人能让我明白我的无知。


共有3个答案

徐正雅
2023-03-14

根据文档,视图应保持其状态,而不使用setRetainInstance(true)。尝试将其从onCreate中删除,这将强制在屏幕旋转时重新创建片段,因此它的所有视图都应在旋转前保存,并在旋转后恢复。

上官高逸
2023-03-14

TextView默认情况下,子类不保存其文本。您需要在布局中启用freezesText=“true”,或在运行时启用setFreezesText(true),以便保存其状态。

翟元凯
2023-03-14

您应该将片段的状态保存在onSaveInstanceState(Bundle outState)中,并在onViewCreated(View,Bundle SavedState)方法中恢复它。这样,您将最终获得与配置更改之前一样的用户界面。

 类似资料:
  • 问题内容: 我想将自己更改为我尝试过的内容,但无法将我的活动更改为片段。有人可以告诉我该怎么做吗?在哪里编辑我是Android上的新手。请告诉我和在此先感谢 这是我的活动: 问题答案: 只要了解一些步骤,您就可以现在和将来轻松地将Activity转换为Fragment ..: 首先,不要扩展,只要扩展.. 例如: 然后覆盖.. 然后通过LayoutInflater扩展布局,并分配给进一步用于子视图

  • 这个项目是可以在Android Studio中找到的Master/Detail流模板的扩展。不同之处在于,这个应用程序使用一个活动和一个管理三个片段的ViewPager。第三个片段是Master(list)片段,其中包含一个可单击的Recyview。当单击列表项时,它会用子(细节)片段切换该片段。 在项目工作时,我希望避免在清单中使用。我该怎么做? baseFragment.java 接口:bri

  • 我需要创建一个“滑动活动”,当用户滑动它时它会滑动。当用户向左“滑动”时,活动应该向左滑动,新的活动会从右侧来到屏幕上。你不能把它放在中间。同样的事情发生在雅虎邮件应用程序中。你可以在阅读邮件时看到这个,向左滑动邮件移动到下一封邮件。就像下面一样。 在图中,您可以看到下一封邮件(标题为“谢谢”)正在从侧面打开。在我的例子中,它们是两种不同的活动。我们还建议在当前活动的右侧显示下一个活动的一小部分(

  • 问题内容: 我要在我的下一个Android项目中使用Retrofit 2.1.0。我想使用设计模式,因此为每个REST调用创建单独的类,即 IBalanceService.java BalanceRestClient.java BalanceActivity.java 如何通过onResponse()更新活动/片段中的UI? 附加信息: 最小SDK:19个 目标SDK:23个 使用OkHttp和g

  • 我现在还在下面提供了一个示例。 我正在使用一个大型应用程序,它将序列化对象(实现可序列化,而不是可执行)从客户机发送到服务器。不幸的是,我们现在有一种情况,即现有字段完全改变了类型,这破坏了序列化。 谢谢你的建议。 5月20日更新-以下示例源--TestData中的字段“number”从旧版本中的“int”变为新版本中的“long”。注新版本的TestData中没有调用readObject(),因

  • 我这么问的原因是因为我多年来一直在专门使用活动,Facebook SDK和Google Maps 2.0迫使我使用片段,现在我想知道与其他实现相比,它们是否本质上“更好”。 如果这个“不具建设性”或“过于开放”,那么答案显然是“不”。但是如果有一些谷歌开发者的文档或博客关于这个确切的主题,那么我想知道它