2012-01-16 35 views
8

我正在为android编写一个手机拨号器应用程序。我为键盘创建了一个布局,其中包含一个TextView和10个按钮。按钮是10位数字(0到9)的按键,TextView用于按照按键显示数字。当设备旋转时TextView的文本消失

在我的应用程序中,我将文本(“0”或“1”等)添加到每个按钮的TextView中。如果我按下了按钮1,2,3 2,则TextView上的文本为123。 问题是,让我们把屏幕处于横向模式,并且TextView包含123,如果我打开它,在纵向模式下TextView上没有文本。

请帮我看看这个。

+0

检查这一项 HTTP帮助://计算器。com/questions/3542333/how-to-prevent-custom-views-from-losing-state-across-screen-orientation-changes/3542895#3542895 – om252345 2012-01-16 11:43:28

+1

你的TextView是否包含id?你使用碎片? – ania 2012-01-16 11:44:02

+0

身份证是在那里,但我不使用片段。 – 2012-01-16 11:48:08

回答

5

请与方向的变化检查,对创建方法被调用,它要求所有的意见,再次创建,所以你需要使用下列方法之一:

  1. 使用onSavedInstance方法和保存状态要捆绑的组件/视图。
  2. 在活动标签android:configChanges =“keyboardHidden | orientation”的清单文件中使用以下标志true。如下图所示:

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

这样做的原因是由于到Android基本上破坏活动,每次旋转设备时再次创建它。这主要是为了允许基于纵向/横向模式的不同布局。

处理此问题的最佳方法是通过响应onSavedInstance事件(在Android销毁活动之前调用),然后重新应用标准onCreate事件中的这些事件来存储您需要保留在活动Bundle中的任何数据。

虽然你可以“方向”添加到configChanges财产,记住,你基本上是告诉你要去进行处理有关的定向Android的一切改变自己 - 包括更改布局等

13

@jeet建议什么不适合我。我不得不添加“screenSize”。这是你应该在你的manifest.xml在<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"> 
+0

加入'screenSize'确实有效!将问题调试了好几个小时,最后这里是一个解决方案。 – TranslucentCloud 2016-04-23 17:27:25

+0

很好用... – 2016-05-11 16:56:32

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称)成束和旋转后(onRestor eInstanceState),您只需从Bundle中提取所有值。 为了澄清,TVNazivPodatka和TVEnotaMere是TextView小部件。

...从 How to prevent custom views from losing state across screen orientation changes