Android:选项菜单清除我的微调器,如何更新它们?

Android:选项菜单清除我的微调器,如何更新它们?,android,refresh,spinner,options-menu,Android,Refresh,Spinner,Options Menu,我的Android应用程序有两个微调下拉菜单,运行良好 但是,现在我添加了一个选项菜单,其中包含: 一个子菜单,带有打开AlertDialog文本框的选项。 一个子菜单,具有更改语言区域设置的选项。 如果单击第一个子菜单中的一个选项,将删除两个微调器中的内容,然后打开文本框。当我从文本框中单击自己时,微调器仍处于清除状态 类似地,如果我单击自己进入更改语言,两个微调器都将被清除,而程序的其余部分将更新为新语言。通过重新启动应用程序,所有内容都会恢复 如果重要的话,微调器从ArrayAdapter

我的Android应用程序有两个微调下拉菜单,运行良好

但是,现在我添加了一个选项菜单,其中包含:

一个子菜单,带有打开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.
     }
}
那么…有人获得了关于如何更新/刷新微调器的帮助吗?

删除此项。setContentViewR.layout.main

以前

 try{
            spinner1.setAdapter(adapter1);
            spinner2.setAdapter(adapter2);
            spinner1.setSelection(1);
            spinner2.setSelection(2);
        } catch (Exception e){
            e.printStackTrace();
        }
在你的两种情况下

工作代码如下:

public class TestSpinner extends Activity {

private ArrayAdapter<CharSequence> adapter1;
private Spinner spinner1;
private ArrayAdapter<CharSequence> adapter2;
private Spinner spinner2;

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.spinner);
    spinner1 = (Spinner) findViewById(R.id.spinner1);
    adapter1 = ArrayAdapter.createFromResource(
            this, R.array.planets_array, android.R.layout.simple_spinner_item);
    adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner1.setAdapter(adapter1);
    MyOnItemSelectedListener listener = new MyOnItemSelectedListener();

    spinner1.setOnItemSelectedListener(listener);
    spinner2 = (Spinner) findViewById(R.id.spinner2);
    adapter2 = ArrayAdapter.createFromResource(
            this, R.array.planets_array1, android.R.layout.simple_spinner_item);
    adapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner2.setAdapter(adapter1);
    spinner2.setOnItemSelectedListener(listener);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    SubMenu faqMenu = menu.addSubMenu(0, 100, 1, "FAQ").setIcon(android.R.drawable.ic_menu_rotate);
    faqMenu.add(1, 101, 0, "set other planents");
    SubMenu langMenu = menu.addSubMenu(0, 200, 2, "LANGAUGE").setIcon(android.R.drawable.ic_menu_rotate);
    langMenu.add(1, 201, 0, "Language1");
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {

        case 101:
            AlertDialog.Builder textbox = new AlertDialog.Builder(TestSpinner.this);
            textbox.setMessage("You've set new planets");
            textbox.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dlg, int i) {
                    dlg.dismiss();
                }
            });
            textbox.show();
            try {
                spinner1.setAdapter(adapter2);
                spinner2.setAdapter(adapter2);
                spinner1.setSelection(1);
                spinner2.setSelection(2);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return true;
        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, "you've set old planets back!", Toast.LENGTH_LONG).show();
            try {
                spinner1.setAdapter(adapter1);
                spinner2.setAdapter(adapter1);
                spinner1.setSelection(1);
                spinner2.setSelection(2);
            } catch (Exception e) {
                e.printStackTrace();
            }

            return true;
    }
    return false;
}

public class MyOnItemSelectedListener implements AdapterView.OnItemSelectedListener {
    public void onItemSelected(AdapterView<?> parent,
                               View view, int pos, long id) {
        Toast.makeText(parent.getContext(), "The planet is " +
                parent.getItemAtPosition(pos).toString(), 1).show();
    }

    public void onNothingSelected(AdapterView parent) {
    }
}

private void refresh() {
        finish();
        Intent myIntent = new Intent(TestSpinner.this, TestSpinner.class);
        startActivity(myIntent);
    }
}

干杯

如何设置喷丝头1.setAdapteradapter1;返回你什么时候回setAdapter?可能您应该使用AlertDialog的onDestroy。您正在调用this.setContentViewR.layout.main;什么时候调用setAdapterI调用spinner1.setAdapteradapter1在onCreate方法中创建适配器后立即调用,但在此代码中不再调用。但是我试着把它放在其他地方。另外,它也没用。。。我检查了API,但找不到AlertDialog类的任何onDestroy方法。请在全局范围内将ArrayAdapter adapter1设置为私有。然后在onCreate中设置它。然后尝试在this.setContentViewR.layout.main之后调用spinner1.setAdapteradapter1;在你的两种情况下。看看是否有效。谢谢,我试过了,但它使活动崩溃。注意:很遗憾,您的活动已停止,OK,您的异常是什么?将微调器和适配器1移动到onCreate方法之前的全局范围。其他方法应该可以看到all,并删除其中的final关键字。但是语言设置还不起作用-如果您选择的语言与以前不同,仍然需要重新启动应用程序以重新加载字符串。请阅读此部分了解如何更改语言,并阅读此部分以联机应用语言,您仍然需要重新启动活动在哪里应用它,你也必须记住旋转。我可以提供重新启动活动的代码,但在重新启动之前,您必须记住微调器的选择和其他内容,但它会立即重新启动并应用语言设置。阅读我提供的链接。啊哈,是的,我以前使用过这两个链接,但我还没有找到自动重新启动应用程序的代码。如果你能给我一个提示那就太好了。在我的例子中,在重新启动之前不需要保存太多数据。我已经用刷新方法更新了答案。您可能应该为语言更改添加一个optionmenu,并在更改区域设置后立即调用此刷新方法。它将重新启动活动并应用您的区域设置。