【问题标题】:Getting NullPointerException when accessing spinner of another class访问另一个类的微调器时获取 NullPointerException
【发布时间】:2013-10-21 14:37:59
【问题描述】:

我有两个课程SettingsMainActivity。我正在尝试从 MainActivity 类访问在 Settings 类中创建的微调器。

这通常有效

public static Settings getlang = new 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;
    }


}

【问题讨论】:

  • 不创建视图....您想访问该视图
  • 你有什么要求????您是否要访问一个视图,甚至在另一个活动中都没有被重新评估.... ???
  • 如果设置从未打开,您将无法从主活动访问微调器,因为微调器永远不会被实例化。将您想要访问元素的方式从一个活动更改为另一个活动,或实施另一个想法。您不会总是在场以告知用户首先进入哪个屏幕。他们会随心所欲地使用应用程序。

标签: java android nullpointerexception sharedpreferences android-spinner


【解决方案1】:

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

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

现在,当您第一次打开应用程序并且没有为语言设置首选项时,您可以设置一个默认值(比如英语)当用户从设置微调器更改语言时,您可以将其保存在 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.

【讨论】:

  • 是的,这就是我想要做的。我不知道如何创建 sharedpreferences.xml。能举个例子吗?
  • 这并没有真正起作用。我将写入数据到 SharedPreferences 部分放在 Settings 的 onCreate 中,并将从 Shared Preferences 读取数据放到 MainActivity 的 onCreate 中。我试图用 getlang.getLang1().getItemAtPosition(spinner_value) 读取微调器值它没有用。我做错了什么?
  • 您不需要使用“getlang.getLang1().getItemAtPosition(spinner_value)”方法读取 Spinner 的值。您只需要从共享首选项中读取它。
  • 您在 Settings.class 中的代码很好。在 MainActivity.class 中添加这些代码行以读取 Spinner 的值。 SharedPreferences sharedPref = getSharedPreferences("FileName", MODE_PRIVATE); TextView tv = (TextView) findViewById(R.id.tv_spinner); tv.setText(String.valueOf(sharedPref.getInt("userChoiceSpinner", -1)));
【解决方案2】:

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

你必须这样做:

制作方法:

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

并预先运行它。

【讨论】:

    【解决方案3】:

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

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

    Activity 是由 startActivity 带着意图启动的。 Activity 有一个 ui 和生命周期。

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

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

    你也可以使用SharedPreferences

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-12
        相关资源
        最近更新 更多