Java Android spinner在活动更改时不保留值(与生命周期相关)
在我的活动中,我有一个微调器和一个列表视图。微调器用于过滤ListView中的项。当用户单击列表项时,将调用另一个活动,该活动显示列表项的详细信息。然后,在“详细信息”活动中,用户按下“上一步”按钮,微调器(因此列表)重置为其初始值 这是因为我将微调器的适配器填充到onStart()方法中,并将其声明为onItemSelectedListener,当用户按下back按钮时,会再次调用该方法。此外,onStart()方法实际上会调用onItemSelectedListener一次 我如何避免这种行为?我想我应该把侦听器和适配器移到其他地方,但是在哪里呢 这是本课程的概述Java Android spinner在活动更改时不保留值(与生命周期相关),java,android,spinner,lifecycle,Java,Android,Spinner,Lifecycle,在我的活动中,我有一个微调器和一个列表视图。微调器用于过滤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()方法中实例化了适配器和侦听器。