Java Android spinner在活动更改时不保留值(与生命周期相关)

Java Android spinner在活动更改时不保留值(与生命周期相关),java,android,spinner,lifecycle,Java,Android,Spinner,Lifecycle,在我的活动中,我有一个微调器和一个列表视图。微调器用于过滤ListView中的项。当用户单击列表项时,将调用另一个活动,该活动显示列表项的详细信息。然后,在“详细信息”活动中,用户按下“上一步”按钮,微调器(因此列表)重置为其初始值 这是因为我将微调器的适配器填充到onStart()方法中,并将其声明为onItemSelectedListener,当用户按下back按钮时,会再次调用该方法。此外,onStart()方法实际上会调用onItemSelectedListener一次 我如何避免这种行

在我的活动中,我有一个微调器和一个列表视图。微调器用于过滤ListView中的项。当用户单击列表项时,将调用另一个活动,该活动显示列表项的详细信息。然后,在“详细信息”活动中,用户按下“上一步”按钮,微调器(因此列表)重置为其初始值

这是因为我将微调器的适配器填充到onStart()方法中,并将其声明为onItemSelectedListener,当用户按下back按钮时,会再次调用该方法。此外,onStart()方法实际上会调用onItemSelectedListener一次

我如何避免这种行为?我想我应该把侦听器和适配器移到其他地方,但是在哪里呢

这是本课程的概述

public static ArrayList<String> years;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.archive);

    // populate years array here
}

@Override
protected void onStart()
{
    super.onStart();

    Spinner spinner = (Spinner) findViewById(R.id.spinner_anni);

    // create spinner adapter
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, ArchiveActivity.years);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(adapter);

    // create spinner listener
    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
    {
        @Override
        public void onItemSelected(AdapterView<?> parentView,
                View selectedItemView, int position, long id)
        {
            filterList(ArchiveActivity.years.get(position));
        }

        @Override
        public void onNothingSelected(AdapterView<?> parentView)
        {
            return;
        }
    });

    // create list listener
    ListView list = (ListView) findViewById(R.id.list_archive);
    list.setOnItemClickListener(this);
}

private void filterList(String year)
{
    // filter list data here
}

@Override
public void onItemClick(AdapterView<?> list, View item, int pos, long id)
{
    // call detail activity for list item that's been pressed
    Intent i = new Intent(this, DetailActivity.class);
    startActivity(i);
}
公共静态数组列表年份;
@凌驾
创建时受保护的void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.archive);
//在这里填充数组
}
@凌驾
受保护的void onStart()
{
super.onStart();
微调器微调器=(微调器)findViewById(R.id.Spinner\u anni);
//创建微调器适配器
ArrayAdapter=新的ArrayAdapter(此,
android.R.layout.simple\u spinner\u项目,ArchiveActivity.years);
setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项);
旋转器。设置适配器(适配器);
//创建微调器侦听器
spinner.setOnItemSelectedListener(新的AdapterView.OnItemSelectedListener()
{
@凌驾
已选择公共视图(AdapterView父视图,
视图选择编辑视图,整数位置,长id)
{
过滤器列表(ArchiveActivity.years.get(position));
}
@凌驾
未选择公共无效(AdapterView父视图)
{
返回;
}
});
//创建列表侦听器
ListView列表=(ListView)findViewById(R.id.list\u存档);
list.setOnItemClickListener(此);
}
专用空过滤器列表(字符串年)
{
//此处筛选列表数据
}
@凌驾
public void onItemClick(AdapterView列表、视图项、整数位置、长id)
{
//为已按下的列表项调用详细信息活动
意图i=新意图(此,DetailActivity.class);
星触觉(i);
}

您可以保存活动状态并将其加载回


查看和方法

通常,您在onCreate()方法中启动了微调器和适配器。此外,您必须保存微调器的状态,并在活动返回前台时重新创建它。检查如何保存应用程序状态。

但是在onCreate()方法中findViewById是否会返回null?您的意思是“Spinner Spinner=(Spinner)findViewById(R.id.Spinner_anni);”?如果您在“setContentView(R.layout.archive);”之后调用它,就可以了谢谢,成功了。在setContentView()之后,我在onCreate()方法中实例化了适配器和侦听器。