代码之家  ›  专栏  ›  技术社区  ›  Samah

Android方向更改调用onCreate

  •  14
  • Samah  · 技术社区  · 15 年前

    我制作了一个搜索屏幕,其中有一个用于关键字、过滤器和搜索按钮的选项卡,还有三个用于不同类型结果的可选选项卡(每个选项卡包含一个 ListView 带着一个 ArrayAdapter ). 启动活动时,开发人员可以选择将结果作为额外的 Parcelable[] 如果已经执行了搜索。在 onCreate() 可打包的[] 通过了。

    onCreate() . 这意味着我的搜索结果将重置为 可打包的[] 开始活动时通过。

    到目前为止我唯一的解决办法就是打电话 finish() startActivity() 用新结果重新启动活动。我确信一定有一个更简单的解决办法,而且我做了一些非常愚蠢的事情。

    有没有更好的办法?

    3 回复  |  直到 9 年前
        2
  •  15
  •   Pratik Butani Umesh N    11 年前

    你所描述的是默认行为。您必须自己通过添加以下内容来检测和处理这些事件:

    android:configChanges
    

    android:configChanges="orientation"
    

    对于打开或关闭键盘,您可以使用:

    android:configChanges="keyboardHidden"
    

    android:configChanges="keyboardHidden|orientation"
    

    这将触发 onConfigurationChanged Activity 你打电话。 如果重写该方法,则可以传入新值。

        3
  •  1
  •   lucidbrot    6 年前

    android:configChanges="orientation" 告诉android你想自己处理配置更改,而不是让它重新创建活动。但是,这是不鼓励的:

    默认情况下关闭并重新启动,但使用以下命令声明配置 属性将阻止重新启动活动。取而代之的是 活动仍在运行,其onConfigurationChanged()方法为 万不得已。有关更多信息,请阅读“处理运行时更改” 有关如何正确处理由于 配置更改。 Source )

    在配置更改期间保留对象有一种不同的方法: ViewModel

    MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);
    

    如果你使用 LiveData 在其中,您可以订阅文档中概述的数据更改。以下是他们的示例,以防链接在某个点死亡:

    体系结构组件为UI提供ViewModel帮助程序类 ViewModel对象在配置期间自动保留 更改以使其所保存的数据立即可供下一个用户使用 活动或片段实例。例如,如果需要显示 应用程序中的用户列表,请确保将责任分配给 获取并保留ViewModel的用户列表,而不是 活动或片段,如以下示例代码所示:

    public class MyViewModel extends ViewModel {
        private MutableLiveData<List<User>> users;
        public LiveData<List<User>> getUsers() {
            if (users == null) {
                users = new MutableLiveData<List<User>>();
                loadUsers();
            }
            return users;
        }
    
        private void loadUsers() {
            // Do an asynchronous operation to fetch users.
        } } You can then access the list from an activity as follows:
    
    public class MyActivity extends AppCompatActivity {
        public void onCreate(Bundle savedInstanceState) {
            // Create a ViewModel the first time the system calls an activity's onCreate() method.
            // Re-created activities receive the same MyViewModel instance created by the first activity.
    
            MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);
            model.getUsers().observe(this, users -> {
                // update UI
            });
        } }
    

    如果活动被重新创建,它将收到相同的MyViewModel 所有者活动完成后,框架调用ViewModel 对象的onCleared()方法,以便它可以清理资源。