0

と の 2 つのクラスがSettingsありMainActivityます。クラスで作成されたスピナーにSettingsクラスからアクセスしようとしていますMainActivity

これは通常動作します

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;
    }


}
4

4 に答える 4

2

コードから、Settings.classでSpinnerを使用してユーザーの言語を選択し、それをSharedPreferences .xmlにも保存していると推測できます (または推測することもできます) 。

したがって、Spinner オブジェクトからスピナーの値を取得する代わりに、SharedPreferences.xml から値を読み取るだけです。そうでない場合でも、これが問題に取り組む最善の方法だと思います。

アプリを初めて開いたときに、言語の環境設定が設定されていない場合は、デフォルト値 (英語など) を設定できます。ユーザーが設定スピナーから言語を変更すると、それを SharedPreferences に保存し、 MainActivity.class から読み取ることができます

Shared Preferences を操作するためのコード:

--> 共有プリファレンスにデータを書き込む場合:

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.
于 2013-10-14T06:22:03.557 に答える
0

このメソッドonCreateは、その特定のアクティビティが少なくとも 1 回開始された場合にのみ呼び出されます。ただし、そのSettingsアクティビティを開始していないため、アクセスしようとしているスピナーは初期化されませんfindViewByid(id)。そのため、null pointer exceptionが発生しています。

そして、アクティビティを開始した後にそのスピナーにアクセスすると、メソッドが少なくとも1回呼び出されるSettingsため、スピナーは提供されたIDを見つけることができます。onCreate

于 2013-10-14T08:23:57.033 に答える