如果屏幕不旋转,包含ListActivity
和TextView
对象的简单ListView
可以正常工作。
问题说明。首次运行应用时,TextView myText
会显示-1
。有用。点击不同的项myText
时,设置/显示所选项目ID(或位置)的值。所以,它也有效。在某个时刻,当选择项目Two
并且myText
显示2
时,我会旋转屏幕,myText
变为-1
(因为onCreate
}再次触发),这意味着,ListView myList
清除选择,但项目Two
仍然保持选中状态(绘制为已检查的RadioButton)。问题是什么? (P.S。GridView也是如此)。
这是我的源代码:
activity_test.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".TestActivity">
<include layout="@layout/content_test" />
</android.support.design.widget.CoordinatorLayout>
content_test.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".TestActivity">
<TextView
android:id="@+id/myText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ListView
android:id="@android:id/list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/myText"
android:choiceMode="singleChoice"/>
</RelativeLayout>
TestActivity.java
import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class TestActivity extends ListActivity {
static String[] items = {"Zero", "One", "Two"};
TextView myText;
ListView myList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
myList = (ListView) findViewById(android.R.id.list);
setListAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_single_choice, items));
myText = (TextView) findViewById(R.id.myListViewSelectedText);
myText.setText(String.valueOf(myList.getSelectedItemPosition()));
}
@Override
public void onListItemClick(ListView parent, View view, int position, long id) {
myText.setText(String.valueOf(position));
}
}
答案 0 :(得分:1)
发生配置更改时,将重新创建所有活动以确保使用正确的资源。
保留所需状态的一种方法是覆盖onSaveInstanceState()
将所需的所有数据放入提供的Bundle
参数中。然后,当重新创建活动时,您可以从Bundle
中提供的onCreate()
参数中提取保存的值。
只需保存所选列表元素的索引,然后在重新创建时将其设置回来。
答案 1 :(得分:1)
尝试这个
<activity
android:name=".TestActivity"
android:label="@string/title_activity_test"
android:theme="@style/AppTheme"
android:configChanges="orientation|keyboardHidden|screenSize"/>
答案 2 :(得分:1)
保存实例是一个更复杂的过程,@ danail-alexiev是正确的,在某些情况下,您手动保存数据而不是恢复数据。
但为什么Checkbox会保持检查状态?简而言之,因为它有自己的onSaveInstanceState
实现来处理它。并且有一些魔法可以调用它并使用视图ID映射此Parcelable数据。你可以做简单的实验,创建空的应用程序,在布局中添加EditText,无需id - 运行它,放置一些文本,更改方向,繁荣 - 数据丢失。然后使用id重试。
您可以在此处找到很好的解释:Saving instance state