Android SDK中类似于iOS的viewWillAppear的方法是什么?

11

情境

我有一个相当简单的应用程序,使用SharedPreferences拥有两个“布局”。

  • Main.xml
  • Settings.xml

主要是一个textView,它使用从SharedPreferences获取的getString。 还有一个打开设置的按钮。

设置页面有一个下拉菜单和一个保存到SharedPreferences的按钮。


当应用程序加载时,textView会在onCreate(Bundle savedInstanceState)内调用setText()进行更新。

问题

当我打开设置并更新SharedPreferences时,我使用返回按钮回到主界面。

由于我在onCreate()内调用setText(),因此textView直到我退出应用程序并再次打开应用程序才会再次更新。

我需要使用哪种方法在从设置页面返回后更新textView?

我的请求类似于iOS的viewWillAppear()。

4个回答

20

onCreate()仅在活动首次启动时调用一次。如果您想要在活动变为活动状态时更新文本,可以改用onResume()。有关Activity生命周期的更多信息,请单击此处


目前我已经使用了Simon的响应,放在了onResume()方法中。 @Override protected void onResume() { super.onResume(); // 在此处设置setText() } - David Todd Watson
在提交问题后,我在挖掘时也发现了这个 :( onResume() update TextView - David Todd Watson

1

你还可以创建一个OnSharedPreferenceChangeListener。在Activity.onCreate()中使用PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener()进行注册。同时,在Activity.onDestroy()中使用PreferenceManager.getDefaultSharedPreferences(this).unregisterOnSharedPreferenceChangeListener()进行注销。


这也听起来很有趣。我能看到使用onResume()每次主屏幕出现都运行额外代码的潜在问题。 - David Todd Watson
还有一件事,如果您使用它,始终保持对监听器的引用,否则它可能无法正常工作。您无论如何需要参考来取消注册它 ;) - Anasthase

0

你也可以使用startActivityForResult启动你的设置活动,然后在你的主活动中实现一个onActivityResult方法:StartingActivities


我已经使用了带有Intent的startActivityForResult()方法,您的方法更好吗? - David Todd Watson
我不会说它更好。OnResume将在其他时间调用,而不仅仅是从设置返回时。如果你只在onActivityResult方法中更新,那么你可以避免在onResume中不必要地检查/更新字段。话虽如此,这在某种程度上取决于个人偏好。 - Chris
好的,我会查看性能和其他问题,以确定哪个解决方案最好... 我非常感激您的帮助。 - David Todd Watson

-3

我找到的最佳解决方案是重写onVisibilityChanged方法

@Override
protected void onVisibilityChanged(View changedView, int visibility){
    super.onVisibilityChanged(changedView, visibility);
    if(visibility==VISIBLE ){
        Log.v("View will appear", "");  
    }
    else{
        Log.v("View will disappear", "");   
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接