如何在Android设备旋转时保持计时器数值不变

4
我正在制作一个简单的计时器应用程序,使用Android的计时器(Chronometer)来跟踪时间。但当我开始计时并将设备旋转到横向模式时,计时器会重置并显示为00:00。我希望它可以保留其值。 竖屏和横屏的布局不同。 竖屏-->在“Layout”文件夹中 横屏-->在“layout_land”文件夹中。
<Chronometer 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content"
    android:id="@+id/chronometer1"
    android:layout_above="@+id/button2"
    android:textStyle="bold"
    android:textColor="@color/Indigo"
    android:text="Chronometer"
    android:layout_toLeftOf="@+id/save_btn"
    android:typeface="serif"
    android:textSize="40dp"/>

1
@ChrisStratton 我不同意。大多数回答都主张使用 android:configChanges="orientation",这绝对是错误的答案。Adil,你应该了解一下 SharePreferences。在 onPause() 中保存当前值,在 onResume() 中恢复它。 - Simon
@Simon:我明白你的意思了,谢谢 :) - AddyProg
@Simon - 请重新阅读所链接问题的主要答案,该答案是关于保存状态的。但就我个人而言,我不确定忽略方向变化是否是错误的答案。手机经常对偶然的倾斜做出反应,这些反应并不能提高可用性。这确实需要在特定的用例中找出最佳解决方案。 - Chris Stratton
@ChrisStratton 此属性的常见用法如下:旋转手机时,应用程序崩溃。初学者阅读有关configChanges的内容并将其添加到清单中。旋转手机后,应用程序不会崩溃。工作完成了! 除了导致原始崩溃的错误仍然存在,只是隐藏起来,并等待其他场景中活动被销毁的机会之一。我还没有看到 configChanges 被用于真正的原因,而 Play Store 中充斥着这些错误的应用程序 - 经常在电话响铃时打开应用程序时出现。作为一个社区,我们应该推广编写生命周期的代码。这并不难。 - Simon
@simon - 对于另一个问题来说,这些都同样适用。请随意在那里发布您自己的答案,或者提名更好的重复问题。 - Chris Stratton
1个回答

2
这是文档中的内容: 重新创建一个Activity 警告:每次用户旋转屏幕时,您的Activity都将被销毁并重新创建。当屏幕方向改变时,系统会销毁和重新创建前台Activity,因为屏幕配置已经改变,您的Activity可能需要加载替代资源(如布局)。
如果您需要在更改方向之前保存Activity的状态,则必须重写onSaveInstanceState()方法。此方法将帮助您保存所有要在方向更改后恢复的值。然后在onCreate()方法中恢复它们。
以下是一个示例:
String myVar;

/* 
     ...
*/
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save myVar's value in saveInstanceState bundle
    savedInstanceState.putString("myVar", myVar);
    super.onSaveInstanceState(savedInstanceState);
}

现在,在创建活动时检索它:
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); 
    // savedInstanceState is the bundle in which we stored myVar in onSaveInstanceState() method above
    // savedInstanceState == null means that activity is being created a first time
    if (savedInstanceState == null) {
        // some code here
        myVar = "first value";
    } else {  // savedInstance != null means that activity is being recreated and onSaveInstanceState() has already been called.
        myVar = savedInstanceState.getString("myVar");
    }
    /*
       ...
    */
}

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