Java Android ListActivity:onCreate每次在屏幕旋转后都会被调用,所选项目会重置,但视觉上仍处于选中状态
如果屏幕不旋转,包含Java Android ListActivity:onCreate每次在屏幕旋转后都会被调用,所选项目会重置,但视觉上仍处于选中状态,java,android,listview,screen-orientation,listactivity,Java,Android,Listview,Screen Orientation,Listactivity,如果屏幕不旋转,包含TextView和ListView对象的简单ListActivity可以正常工作 问题描述。首次运行应用程序时,text查看myText显示-1。它起作用了。单击不同项目时,设置/显示所选项目id(或位置)的值。因此,它也能起作用。在某个特定时刻,例如选择了项Two,并且myText显示2时,我旋转屏幕,myText变为-1(因为onCreate再次触发),这意味着ListView myList清除选择,但项Two仍然保持选中状态(画成选中的单选按钮)。有什么问题吗?(注:G
TextView
和ListView
对象的简单ListActivity
可以正常工作
问题描述。首次运行应用程序时,text查看myText
显示-1
。它起作用了。单击不同项目时,设置/显示所选项目id(或位置)的值。因此,它也能起作用。在某个特定时刻,例如选择了项Two
,并且myText
显示2
时,我旋转屏幕,myText
变为-1
(因为onCreate
再次触发),这意味着ListView myList
清除选择,但项Two
仍然保持选中状态(画成选中的单选按钮)。有什么问题吗?(注:GridView也有同样的情况)
以下是我的源代码:
活动测试.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>
<?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>
content\u 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>
<?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));
}
}
导入android.app.ListActivity;
导入android.os.Bundle;
导入android.view.view;
导入android.widget.ArrayAdapter;
导入android.widget.ListView;
导入android.widget.TextView;
公共类TestActivity扩展了ListActivity{
静态字符串[]项={“零”、“一”、“二”};
文本查看我的文本;
列表视图myList;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_测试);
myList=(ListView)findViewById(android.R.id.list);
setListAdapter(新的ArrayAdapter(这个,android.R.layout.simple_list_item_single_choice,items));
myText=(TextView)findViewById(R.id.myListViewSelectedText);
myText.setText(String.valueOf(myList.getSelectedItemPosition());
}
@凌驾
public void onListItemClick(列表视图父项、视图视图、整型位置、长id){
myText.setText(String.valueOf(position));
}
}
发生配置更改时,将重新创建所有活动,以确保使用正确的资源
保存所需状态的一种方法是重写onSaveInstanceState()
将所有需要的数据放入提供的捆绑
参数。然后,当重新创建活动时,可以从onCreate()
中提供的捆绑
参数提取保存的值
只需保存所选列表元素的索引,然后在重新创建时将其设置回原位。当发生配置更改时,将重新创建所有活动,以确保使用正确的资源 保存所需状态的一种方法是重写
onSaveInstanceState()
将所有需要的数据放入提供的捆绑
参数。然后,当重新创建活动时,可以从onCreate()
中提供的捆绑
参数提取保存的值
只需保存所选列表元素的索引,然后在重新创建时将其设置回原处。试试这个
<activity
android:name=".TestActivity"
android:label="@string/title_activity_test"
android:theme="@style/AppTheme"
android:configChanges="orientation|keyboardHidden|screenSize"/>
试试这个
<activity
android:name=".TestActivity"
android:label="@string/title_activity_test"
android:theme="@style/AppTheme"
android:configChanges="orientation|keyboardHidden|screenSize"/>
保存实例是一个更复杂的过程,@danail alexiev是正确的,在某些情况下,您需要手动保存数据,而不是还原数据 但为什么复选框保持选中状态呢?简而言之,这是因为它有自己的
onSaveInstanceState
实现来处理它。还有一些神奇的东西可以调用它,并用视图id映射这个包裹数据。你可以做简单的实验,创建空的应用程序,在布局中添加EditText,无需id-运行它,放置一些文本,改变方向,等等-数据丢失。然后使用id重试
您可以在这里找到很好的解释:保存实例是一个更复杂的过程,@danail alexiev是正确的,在某些情况下,您手动保存数据,而不是还原数据 但为什么复选框保持选中状态呢?简而言之,这是因为它有自己的
onSaveInstanceState
实现来处理它。还有一些神奇的东西可以调用它,并用视图id映射这个包裹数据。你可以做简单的实验,创建空的应用程序,在布局中添加EditText,无需id-运行它,放置一些文本,改变方向,等等-数据丢失。然后使用id重试
您可以在此处找到很好的解释:坏主意。如文档所述-这是最后的选择,应该避免使用此属性。此处的更多信息:查找configChanges描述。坏主意。如文档所述-这是最后的选择,应该避免使用此属性。此处的更多信息:查找configChanges描述。