访问另一个类的微调器时获取NullPointerException

时间:2013-10-14 03:55:50

标签: java android nullpointerexception sharedpreferences android-spinner

我有两个班级SettingsMainActivity。我正在尝试访问SettingsMainActivity类创建的微调器。

这通常有效

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 个答案:

答案 0 :(得分:2)

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

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

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

使用共享首选项的代码:

- &GT;将数据写入共享首选项:

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

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

- &GT;从共享首选项中读取数据:

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.

答案 1 :(得分:0)

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

你必须做这样的事情:

制作方法:

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

并事先运行。

答案 2 :(得分:0)

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

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

活动由具有intent的startActivity启动。活动有一个生命周期和生命周期。

findviewById在当前膨胀的布局中查找id为id的视图。因此,如果您尝试在MainActivitySettings进行初始化,则会获得NullPointerException

如果需要spinner中的选定值,则可以使用intent在活动之间传递值。

您也可以使用SharedPreferences

答案 3 :(得分:0)

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

当你在启动Settings Activity后访问该微调器时,微调器就能找到它所提供的id,因为onCreate方法至少被调用一次。