我有一个带有一些提示文字的EditText视图。
当设备旋转时,提示变为真实文本。
如果用户之前已经写过一些文字 - 它被覆盖了。
如何更改行为?停止提示变成文本?
答案 0 :(得分:0)
这与跨旋转保存数据有关。基本上,您的数据会在轮换时被销毁。
要解决此问题,您需要保存运行时配置更改中的数据(在这种情况下为旋转)。
执行此操作的一种方法是覆盖活动中的onSaveInstanceState(Bundle outState)
。
我在onPause()
onStop()
和onDestroy()
我从一本好书中读到:
onSaveInstanceState(...)的默认实现会询问所有活动的视图 将其状态保存为Bundle对象中的数据。 Bundle是一种将字符串键映射到的结构 某些有限类型的值 你以前见过这个Bundle。它被传递到onCreate(Bundle)
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//
}
当你覆盖onCreate(...)时,你在活动的超类上调用onCreate(...)并传递 在你刚收到的捆绑中。在超类实现中,视图的保存状态是 检索并用于重新创建活动的视图层次结构。
这是很酷的部分..
您需要覆盖onSavedInstanceState以将其他数据保存到您的包中,然后使用onCreate()
方法重新读取该数据。
因此,无论您想要在旋转中保存哪些数据,都需要将该数据添加到此捆绑包中。
这样做..
添加一个常量,该常量将作为将存储在包中的键。
private static final String MY_KEY = "My Key";
然后覆盖onSaveInstanceState()
以将常量MY_KEY
作为关键字将数据值写入包中。
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
savedInstanceState.putInt(MY_KEY, YOUR DATA THAT YOU KEEP LOSING ON ROTATION GOES HERE!!!!!);
}
最后在onCreate
检查此值,如果存在则将其分配给您的变量。
if (savedInstanceState != null) {
TheTextThatYouKeepLosing = savedInstanceState.getInt(MY_KEY, 0);
}
答案 1 :(得分:0)
如果您的操作方式与我相同,可能会有所帮助,并发布答案以进行一些格式化。
我遇到了完全相同的问题。我正在将fragment
添加到activity
中的onCreate
中,如下所示:
fragmentTransaction.add(R.id.fragment, fragment, tag);
由于这一点,每当我旋转设备时都遇到与您提到的完全相同的问题,然后我仔细检查并发现每个旋转片段上都添加了这个问题。
就我而言,解决方案是将add
替换为replace
,如下所示。完成此问题后,问题得到解决。
fragmentTransaction.replace(R.id.toDoFragment, fragment, tag);