【发布时间】:2012-02-02 10:00:00
【问题描述】:
我的 Android 应用有两个 Spinners(下拉菜单)工作正常。
但是,现在我添加了一个 OptionsMenu:
- 一个带有打开 AlertDialog 文本框选项的子菜单。
- 一个包含更改语言(区域设置)选项的子菜单。
如果我单击第一个子菜单中的一个选项,我的两个微调器中的内容都会被删除,然后文本框就会打开。当我从文本框中单击自己时,微调器仍然被清除。
同样,如果我单击自己更改语言,两个微调器都会被清除,而程序的其余部分会更新为新语言。重启应用,所有内容都恢复了。
如果重要的话,微调器会从 ArrayAdapter 中获取它们的内容。
所以我想知道,当微调器被清除后,我该如何更新它们?我尝试使用 onCreate、onResume 或 onConfigurationChanged 中的代码“重新填充”微调器,但没有做出任何改变。
如果您需要,我可以找到更多代码,但至少这里有一些:
Spinner spinner1;
Spinner spinner2;
ArrayAdapter<CharSequence> adapter1;
ArrayAdapter<CharSequence> adapter2;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.main);
spinner1 = (Spinner) findViewById(R.id.spinner1);
adapter1 = ArrayAdapter.createFromResource(
this, R.array.some_array, android.R.layout.simple_spinner_item);
adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner1.setAdapter(adapter1);
spinner1.setSelection(1);
// Same procedure for spinner2...
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
Resources res = getResources();
SubMenu faqMenu = menu.addSubMenu(0, 100, 1, res.getString(R.string.FAQ)).setIcon(android.R.drawable.ic_menu_rotate);
faqMenu.add(1, 101, 0, R.string.someText);
SubMenu langMenu = menu.addSubMenu(0, 200, 2, res.getString(R.string.language)).setIcon(android.R.drawable.ic_menu_rotate);
langMenu.add(1, 201, 0, "Language1");
langMenu.add(1, 202, 0, "Language2");
langMenu.add(1, 203, 0, "Language3");
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case 101:
AlertDialog.Builder textbox = new AlertDialog.Builder(main.this);
Resources res = getResources();
textbox.setMessage(res.getString(R.string.someText));
textbox.show();
this.setContentView(R.layout.main);
try{
spinner1.setAdapter(adapter1);
spinner2.setAdapter(adapter2);
spinner1.setSelection(1);
spinner2.setSelection(2);
} catch (Exception e){
e.printStackTrace();
}
break;
case 201:
Locale locale = new Locale("en");
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
Toast.makeText(this, "Here is text in Language1! But unfortunately you need to restart the app before the spinners start working again...sorry!", Toast.LENGTH_LONG).show();
this.setContentView(R.layout.main);
try{
spinner1.setAdapter(adapter1);
spinner2.setAdapter(adapter2);
spinner1.setSelection(1);
spinner2.setSelection(2);
} catch (Exception e){
e.printStackTrace();
}
break;
// Similar code for options 202, 203
}
return super.onOptionsItemSelected(item);
}
final Button button = (Button) findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {
// Perform action on click
public void onClick(View v) {
// Make text box
AlertDialog.Builder textbox = new AlertDialog.Builder(MyActivity.this);
Resources res = getResources();
// Get the chosen values from the spinners
String spinner1choice = spinner1.getSelectedItem().toString();
String spinner2choice = spinner2.getSelectedItem().toString();
// Some code for showing the selected items.
}
}
那么...有人对如何更新/刷新微调器有任何帮助吗?
【问题讨论】:
-
如何设置 spinner1.setAdapter(adapter1);背部?当你打电话给 setAdapter() 回来?可能你应该使用 AlertDialog 的 onDestroy()。您正在调用 this.setContentView(R.layout.main);你什么时候调用 setAdapter()
-
我在制作适配器后立即调用
spinner1.setAdapter(adapter1)(在onCreate()方法中),但再也不会在这段代码中调用了。但是我已经尝试将它放在其他地方,但没有帮助...我检查了 API,但找不到AlertDialog类的任何onDestroy()方法。 -
将 ArrayAdapter
适配器 1 在全局范围内设为私有。然后在 onCreate() 中设置它。然后在您的两种情况下尝试在 this.setContentView(R.layout.main);之后立即致电spinner1.setAdapter(adapter1)。看看它是否会起作用。 -
谢谢,我试过了,但它使活动崩溃。:“不幸的是,yourActivity 已停止(OK)”
-
你的例外是什么?将微调器和适配器 1 移动到 onCreate() 方法之前的全局范围。 all 应该对其他方法可见,并在那里删除
final关键字。
标签: android refresh spinner options-menu