设备旋转时TextView的文本消失

10

我正在为安卓手机编写一个电话拨号应用程序。我创建了一个按键布局,其中包含一个TextView和10个按钮。按钮作为10个数字(0到9)的键,TextView用于按下键后显示相应数字。

在我的应用中,我对TextView追加文本(例如"0"或"1"等),以便为每个按键添加数字。如果我按下按钮1、2、3,则TextView上的文本为123。 问题是,如果屏幕处于横向模式并且TextView包含123,则在转换为纵向模式时,TextView上没有任何文本。

请帮助我解决这个问题。


请查看以下链接: https://dev59.com/GnA65IYBdhLWcg3w9DqF#3542895 - om252345
1
你的 TextView 包含 ID 吗?你使用了碎片吗? - ania
ID是存在的,但我没有使用片段。 - Yugandhar Babu
1
将以下内容添加到您的Java类中:@Override public void onConfigurationChanged(final Configuration newConfig) { // 忽略方向更改以防止活动重新启动 super.onConfigurationChanged(newConfig); }并在您的清单文件中添加以下内容:这样应该就可以了。 - Mukunda
@Mukunda 谢谢,现在它可以正常工作了。但是只有 android:configChanges="orientation 就足够了。 - Yugandhar Babu
@YugandharBabu 是的,只需要 orientation 就可以了,但是 Android 文档中说需要 orientation|keyboardHidden,在 2.3 版本之后,您还需要添加 screenSize - Mukunda
5个回答

16

jeet推荐的方法对我不起作用。我必须添加"screenSize"。在您的活动的<activity>节点中,这是您应该添加的行:

android:configChanges="keyboardHidden|orientation|screenSize"

因此,完整的节点可能如下所示:
<activity
android:name=".YourActivity"
android:label="@string/app_name"
android:configChanges="keyboardHidden|orientation|screenSize"
android:theme="@style/AppTheme.NoActionBar">

添加 screenSize 就解决了问题!调试了几个小时,终于找到了解决方案。 - Neurotransmitter

9

请在屏幕旋转时进行检查,onCreate()方法会被调用,这需要重新创建所有视图,因此您需要使用以下方法之一:

  1. use onSavedInstance method and save the states of components/views to bundle.
  2. Just use following flag true in your manifest file in activity tag android:configChanges="keyboardHidden|orientation". like below:

    <activity android:name=".SampleActivity" android:label="@string/app_name"
        android:configChanges="keyboardHidden|orientation">
        ...
    </activity>
    

8
这是因为Android在旋转设备时基本上会销毁活动并重新创建它。这主要是为了允许根据纵向/横向模式使用不同的布局。
处理此问题的最佳方法是通过响应onSavedInstance事件(在Android销毁活动之前调用)将需要保留的任何数据存储在活动Bundle中,然后在标准的onCreate事件中重新应用这些数据。
虽然您可以将"orientation"添加到configChanges属性中,但请记住,这基本上意味着您要自己处理与方向变化相关的所有内容,包括更改布局等。

2

0

如果有人仍然遇到问题...这个方法对我很有帮助

public class BranjeKP extends AppCompatActivity {

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

    //...
}

@Override
protected void onSaveInstanceState(Bundle out) {
    super.onSaveInstanceState(out);
    out.putString("TVNazivPod", TVNazivPodatka.getText().toString());
    out.putString("TVEnotaMere", TVEnotaMere.getText().toString());
}

@Override
protected void onRestoreInstanceState(Bundle in) {
    super.onRestoreInstanceState(in);
    TVNazivPodatka.setText(in.getString("TVNazivPod"));
    TVEnotaMere.setText(in.getString("TVEnotaMere"));
}

你可以在旋转之前(即 onSaveInstanceState 被调用时)将任何想要保存的值存储到 Bundle 中,在旋转后(即 onRestoreInstanceState)只需从 Bundle 中取出所有值即可。 需要澄清的是,TVNazivPodatka 和 TVEnotaMere 是 TextView 小部件。
借助于如何防止自定义视图在屏幕方向更改时丢失状态,我们可以更好地完成这个过程。

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