我有两个班级Settings
和MainActivity
。我正在尝试访问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;
}
}
答案 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的视图。因此,如果您尝试在MainActivity
中Settings
进行初始化,则会获得NullPointerException
。
如果需要spinner中的选定值,则可以使用intent在活动之间传递值。
您也可以使用SharedPreferences
答案 3 :(得分:0)
仅当特定活动至少启动一次时才调用方法onCreate
。但由于您甚至没有启动Settings
活动,因此您尝试访问的微调器不会被初始化,因为微调器不会找到您findViewByid(id)
给出的ID。这就是为什么你得到空指针异常。
当你在启动Settings
Activity后访问该微调器时,微调器就能找到它所提供的id,因为onCreate
方法至少被调用一次。