0

我有两个班级SettingsMainActivity. 我正在尝试Settings从班级访问在班级创建的微调器MainActivity

这通常有效

public static Settings getlang = new Settings();

问题是,如果我尝试在不先打开 Settings 活动并直接进入 MainActivity 的情况下执行此操作,我会在这一行得到 NullPointerException

getlang.getLang1().setSelection(getlang.getLang());

但是,如果我先打开Settings活动然后转到MainActivity一切正常。

我怎样才能解决这个问题?

这里是Settings活动

public class Settings extends Activity {

    public SharedPreferences prefsSet;
    public String prefNameSet = "MyPrefSet";

    public static final String PREFS_NAME_SET = "SAVEDATASET";

    private static final String SPINNER1_STATE = "spinner1_state";

    public int language;

    public int userChoice;

    private static Spinner spinner1;
    private Button savesett;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.settings);

        savesett = (Button) findViewById(R.id.bSaveSett);

        spinner1 = (Spinner) findViewById(R.id.spinner1);
        SharedPreferences sharedPref = getSharedPreferences("FileName",
                MODE_PRIVATE);
        int spinnerValue = sharedPref.getInt("userChoiceSpinner", -1);
        if (spinnerValue != -1)
            // set the value of the spinner
            spinner1.setSelection(spinnerValue);

        spinner1.setOnItemSelectedListener(new OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> parent, View view,
                    int pos, long id) {
                // TODO Auto-generated method stub
                userChoice = spinner1.getSelectedItemPosition();
                SharedPreferences sharedPref = getSharedPreferences("FileName",
                        0);
                SharedPreferences.Editor prefEditor = sharedPref.edit();
                prefEditor.putInt("userChoiceSpinner", userChoice);
                prefEditor.commit();
                Toast.makeText(
                        parent.getContext(),
                        "Chosen Language: "
                                + parent.getItemAtPosition(pos).toString(),
                        Toast.LENGTH_LONG).show();
            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0) {
                // TODO Auto-generated method stub

            }
        });

        savesett.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent ourIntent = new Intent(Settings.this, MainActivity.class);
                startActivity(ourIntent);
            }

        });
    }

    public int getLang() {

        return userChoice;}

        public Spinner getLang1() {

            return Settings.spinner1;
    }


}
4

4 回答 4

2

从您的代码中,我可以假设(或可能猜测)您正在使用Settings.class中的Spinner选择用户的语言,并且您还将它保存在SharedPreferences .xml 中。

因此,现在不是从 Spinner 对象获取微调器的值,而是从 SharedPreferences.xml 中读取它。即使您不这样做,我认为这是解决您的问题的最佳方法。

现在,当您第一次打开应用程序并且没有为语言设置首选项时,您可以设置默认值(比如英语)当用户从 Settings 微调器更改语言时,您可以将其保存在 SharedPreferences 中,然后从 MainActivity.class 中读取它

使用共享首选项的代码:

--> 将数据写入共享首选项:

SharedPreferences prefs = getPreferences(MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();

// Saving Data to Shared Preferences
editor.putInt("userChoiceSpinner", 1);
editor.commit();

--> 从共享首选项中读取数据:

SharedPreferences prefs = getPreferences(MODE_PRIVATE);
int spinner_value = prefs.getInt("userChoiceSpinner", -1); // Here -1 is the default value to return when there is no value for the key "userChoiceSpinner" in the Shared Preferences.
于 2013-10-14T06:22:03.557 回答
0

通过不创建 Spinner 的实例,spinner1 = (Spinner) findViewById(R.id.spinner1);永远不会运行。

你必须做这样的事情:

做一个方法:

    public static void setSpinner(int id){
        spinner=findViewById(id);
    }

并事先运行它。

于 2013-10-14T04:02:53.477 回答
0

您不应该创建活动类的实例

   public static Settings getlang = new Settings(); // wrong

Activity 由 startActivity 有意图地启动。Activity 有一个 ui 和生命周期。

findviewById在当前膨胀的布局中查找具有 id 的视图。因此,如果您尝试初始化 in MainActivitywhich is in,Settings您将得到NullPointerException.

如果您需要从微调器中选择的值,您可以使用意图在活动之间传递值。

SharedPreferences你也可以使用

于 2013-10-14T04:18:06.167 回答
0

onCreate仅当该特定活动至少启动一次时才调用该方法。但是由于您甚至没有启动该Settings活动,因此您尝试访问的微调器将不会被初始化,因为该微调器将找不到您提供的 id findViewByid(id)。这就是为什么你得到空指针异常

并且当您在启动SettingsActivity 后访问该微调器时,微调器能够找到它提供的 id,因为onCreate方法至少被调用一次。

于 2013-10-14T08:23:57.033 回答