1

タスク:ユーザーが設定から選択した国をアプリに読み取らせ、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);
4

0 に答える 0