タスク:ユーザーが設定から選択した国をアプリに読み取らせ、setCountry() を使用してアプリを再起動したときに、ユーザーが選択した国に対応するラジオ ボタンで performClick() メソッドを使用しようとしています。
問題: performClick() で NullPointerException が発生する。
ログ猫:
E/AndroidRuntime(23373): 原因: java.lang.NullPointerException 01-04 15:20:27.025: E/AndroidRuntime(23373): geminide.software.mpg.Main.setcountry(Main.java:256) 01- 04
[setcountry() メソッド] (ここで問題が発生します)
プリファレンスが設定されているクリック実行メソッドで例外がキャッチされました。プリファレンスが UK に設定されていて、アプリが再度開かれた場合、radiouk.performclick() で捕捉されます。
public void setcountry() {
SharedPreferences pref = PreferenceManager
.getDefaultSharedPreferences(this);
String value = pref.getString("updates_country", "United States");
if (value.equals("Europe")) {
radioeu.performClick();
} else if (value.equals("United States")) {
radious.performClick();
} else if (value.equals("United Kingdom")) {
radiouk.performClick(); ... this is line 256, exception is caught because preferences is set to UK.
}
};
[onCreate メソッド内で performClick() を呼び出すラジオ ボタン]
radioeu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
distancelabel.setText("Number of Kilometers:");
gastanklabel.setText(" Number of Liters: ");
unitlabel.setText("L/100km:");
}
});
【好みのクラス】
public class Settings extends PreferenceActivity {
@SuppressWarnings("deprecation")
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings);
// get the specified preferences using the key declared in
// preferences.xml
final ListPreference dataPref = (ListPreference) findPreference("updates_country");
// get the description from the selected item
dataPref.setSummary(dataPref.getEntry());
dataPref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object o) {
// TODO Auto-generated method stub
preference.setSummary(o.toString());
return true;
}
});
}
}
【設定.xml】
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<PreferenceCategory
android:key="first_category"
android:title="Preferences" >
<ListPreference
android:defaultValue="2"
android:entries="@array/country"
android:entryValues="@array/countryValues"
android:key="updates_country"
android:summary=""
android:title="Default Country" />
</PreferenceCategory>
</PreferenceScreen>
解決策:ラジオ ボタンの変数をグローバルとローカルの両方で定義しました。ローカル宣言を削除したところ、例外はなくなりました。
例外:
RadioButton radioeu, radious, radiouk;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setcountry();
RadioButton radioeu = (RadioButton) findViewById(R.id.euradio);
RadioButton radious = (RadioButton) findViewById(R.id.usradio);
RadioButton radiouk = (RadioButton) findViewById(R.id.ukradio);
修理済み:
RadioButton radioeu, radious, radiouk;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setcountry();
radioeu = (RadioButton) findViewById(R.id.euradio);
radious = (RadioButton) findViewById(R.id.usradio);
radiouk = (RadioButton) findViewById(R.id.ukradio);