【问题标题】:How do I get the value of a Spinner of another class? (Getting NullPointerException)如何获得另一个类的 Spinner 的值? (获取 NullPointerException)
【发布时间】:2013-10-14 15:41:46
【问题描述】:

我有两个课程SettingsMainActivity。我正在尝试从MainActivity 类中获取在Settings 类中创建的微调器的选定项。

我在Settings 活动中使用sharedpreferences 在活动关闭时保存选定的微调器值。这行得通。

在我使用 MainActivity 时从设置活动中获取值

public static Settings getlang = new Settings();

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

getLang1() 是我在设置活动中创建的一个方法,它返回 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;
    }

【问题讨论】:

  • 您能发布MainActivity 代码吗?你说问题就在那里……

标签: java android nullpointerexception sharedpreferences android-spinner


【解决方案1】:

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

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

假设用户能够使用微调器来选择他们希望应用检查服务的频率。微调器选项有“1 分钟”、“5 分钟”、“10 分钟”、“15 分钟”、“30 分钟”、“1 小时”。

保存首选项后,我们将保存 1、5、10、15、30 或 60。

使用此信息的 Activity 将返回一个与刷新之间应等待的分钟数相对应的 int。

【讨论】:

  • 由于您正在处理语言,最简单的方法可能是将语言保存为字符串。然后你阅读那个字符串并对其采取行动。我的偏好是使用常量类,因为它消除了任何错字问题。由于您的问题是方法问题,因此我已经让您知道使用的正确方法。如果您在实现它时遇到问题,请使用您的新代码提出一个新问题(或使用新代码更新此问题)。
猜你喜欢
  • 2010-12-29
  • 2011-02-08
  • 2013-10-21
  • 2021-06-19
  • 1970-01-01
  • 2015-10-02
  • 1970-01-01
  • 2021-10-19
  • 2019-04-01
相关资源
最近更新 更多