[英]Save state of activity when orientation changes android
我有一个 aacplayer 应用程序,当方向从纵向变为横向时,我想保存我的活动状态。 TextViews 似乎不是空的,我尝试使用以下方法冻结我的文本视图:
android:freezesText="true"
我的清单:
android:configChanges="orientation"
我也试过这个:
@Override
public void onConfigurationChanged(Configuration newConfig){
super.onConfigurationChanged(newConfig);
setContentView(R.layout.main2);
因此,当方向更改为横向时,我可以看到我的 layout-land main2.xml,这有效,但我的 textview 消失并显示为空。 流媒体音乐效果很好。 当方向改变时我可以收听它,但是每次我改变设备的方向时,textviews 中的文本都消失了。
我应该怎么做才能解决这个问题,以便保存状态?
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
....
....
非常感谢你。
当您的方向发生变化时,您不必手动更改为横向布局文件。 Android 会自动为您执行此操作。 当方向改变时,Android 会破坏您当前的活动并再次创建一个新活动,这就是您丢失文本的原因。
假设您想要纵向和横向的单独布局,您需要做两部分。
假设您有 2 个用于纵向和横向的 XML 布局文件,请将您的 main.xml 布局文件放在以下文件夹中:
res/layout/main.xml <-- 这将是你的纵向布局
res/layout-land/main.xml <-- 这将是您的横向布局
这就是您需要做的所有事情,您不必触摸清单文件来修改android:configChanges="orientation"
或覆盖onConfigurationChanged()
。 实际上,建议您不要为了您要实现的目标而触摸它。
现在从文本视图中保存您的文本 =) 让我们假设您的文本视图在布局 xml 文件中被命名为 MyTextView。 您的活动将需要以下内容:
private TextView mTextView; private static final String KEY_TEXT_VALUE = "textValue"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mTextView = (TextView) findViewById(R.id.main); if (savedInstanceState != null) { CharSequence savedText = savedInstanceState.getCharSequence(KEY_TEXT_VALUE); mTextView.setText(savedText); } } @Override protected void onSaveInstanceState (Bundle outState) { super.onSaveInstanceState(outState); outState.putCharSequence(KEY_TEXT_VALUE, mTextView.getText()); }
基本上,每当 Android 销毁并重新创建您的 Activity 以更改方向时,它都会在销毁之前调用onSaveInstanceState()
并在重新创建之后调用onCreate()
。 无论您在 onSaveInstanceState 包中保存什么,都可以从onCreate()
参数中获取。
所以你想在onSaveInstanceState()
保存文本视图的值,然后读取它并在 onCreate() 中填充你的文本视图。 如果活动是第一次创建(不是由于轮换更改),则onCreate()
的 savedInstanceState 将为空。 你也可能不需要android:freezesText="true"
如果需要,您也可以尝试保存其他变量,因为当活动被销毁和重新创建时,您将丢失所有存储的变量。
static CharSequence savedText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(savedText != null) {
TextView mTextView = (TextView) findViewById(R.id.main);
mTextView.setText(savedText);
}
}
// Another function in activity, when you change text
public void actionButton(View view) {
// Change and save text in textView
savedText = "Change text";
mTextView.setText(savedText);
}
它为我工作。 但我认为它不是很好的代码风格和 android 架构。
有两种方法可以做到这一点,第一种是在AndroidManifest.xml
文件中。 您可以将此添加到您的活动标签中
android:configChanges="keyboardHidden|orientation|screenSize|screenLayout"
或者您可以覆盖两个处理此问题的方法。 这种方法需要更多的努力,但可以说要好得多。 onSaveInstanceState
保存活动被杀死之前的状态,而onRestoreInstanceState
在onStart()
之后恢复该信息。 请参阅官方文档以获得更深入的了解。
在下面的示例代码中,我保存了 2 个int
值、来自微调器的当前选择以及一个单选按钮。
@Override
public void onSaveInstanceState(@NonNull Bundle savedInstanceState) {
spinPosition = options.getSelectedItemPosition();
savedInstanceState.putInt(Constants.KEY, spinPosition);
savedInstanceState.putInt(Constants.KEY_RADIO, radioPosition);
super.onSaveInstanceState(savedInstanceState);
}
// And I am restoring those values with `getInt`, then I can pass those stored values into the spinner and radio button group to select the same values that we saved earlier.
@Override
public void onRestoreInstanceState(@NotNull Bundle savedInstanceState) {
spinPosition = savedInstanceState.getInt(Constants.KEY);
radioPosition = savedInstanceState.getInt(Constants.KEY_RADIO);
options.setSelection(spinPosition, true);
type.check(radioPosition);
super.onRestoreInstanceState(savedInstanceState);
}
我在KOTLIN静态 var / val 中使用:
class MyFragment : Fragment()
{
//all my code
//access to static vars -> MyStaticClass.hello
}
class MyStaticClass
{
companion object {
var hello: String = "Static text"
var number_static: Int = 0
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.