Android ListActivity:每次在屏幕旋转后调用onCreate,所选项目重置,但在视觉上保持选中状态

时间:2016-04-27 13:41:38

标签: java android listview screen-orientation listactivity

如果屏幕不旋转,包含ListActivityTextView对象的简单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));
    }
}

3 个答案:

答案 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