如何获得另一个类的Spinner的值? (获取NullPointerException)

时间:2013-10-14 15:41:47

标签: java android nullpointerexception sharedpreferences android-spinner

我有两个班级SettingsMainActivity。我正在尝试从Settings类的MainActivity类中创建一个微调器的选定项。

我在sharedpreferences活动中使用Settings来保存活动关闭时所选的微调器值。这很有效。

要在MainActivity中使用“设置”活动获取值,请使用

public static Settings getlang = new Settings();

getlang.getLang1().getItemAtPosition(getlang.getLang1().getSelectedItemPosition());

getLang1()是我在Settings活动中创建的一种方法,它返回Spinner本身。

问题是,如果我尝试这样做而不首先打开Settings活动并直接进入MainActivity,我会在此行获得NullPointerException

 getlang.getLang1().getItemAtPosition(getlang.getLang1().getSelectedItemPosition());

但如果我首先打开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;
    }

1 个答案:

答案 0 :(得分:0)

问题是“设置”活动可能会也可能不会实例化。鉴于它是您尝试使用它的主要活动,它很可能永远不会。

您要做的是在首选项中保留微调器的值,而不是微调器项的索引。

考虑用户能够使用微调器的情况,该微调器选择他们希望应用程序检查服务的频率。微调器的选择是“1分钟”,“5分钟”,“10分钟”,“15分钟”,“30分钟”,“1小时”。

保存首选项后,我们将节省1,5,10,15,30或60.

使用此信息的活动将返回一个int,该int对应于刷新之间应等待的分钟数。