0

クラスを読み書きしたいのですSharedPreferencesが、アクティビティでこのクラスを呼び出すと、アプリがクラッシュ/強制終了します

CheckBox「メールを記憶する」がチェックされている場合、アプリはメールを記憶します。

私のLoginActivity

public class LoginActivity extends Activity
{
    private AppPreferences appPreferences;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);        
        appPreferences = new AppPreferences(); // this makes the app crash
        String email = appPreferences.getPreferenceString("email");
        // ...

クラスappPreferences

public class AppPreferences extends Activity
{
    private SharedPreferences settings = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        settings = this.getSharedPreferences(LOGIN_CREDENTIALS, MODE_PRIVATE);
    }
    public String getPreferenceString(String key) {
        return settings.getString(key, DEFAULT_STRING);
    }
    public void setPreferenceString(String key, String value) {
    editor.putString(key, (String) value);
    }
// ...

これを修正するために数時間探していましたが、SO からいくつかのソリューションを試しました。getSharedPreferencesメソッド内でメソッドを呼び出すonCreateので、問題はありません。

私は何を間違っていますか?Java と Android の開発は初めてなので、例を挙げて詳しく説明してください。まったく異なるアプローチの他のソリューションも歓迎します。前もって感謝します。

4

2 に答える 2

1

AppPreferencesでActivityクラスを拡張しないでください。メソッドを削除しonCreate()ます。

このようにしてください。

public class AppPreferences extends Activity
{
    private SharedPreferences settings = null;
    AppPreferences(Context context) {
        settings = context.getSharedPreferences(LOGIN_CREDENTIALS, MODE_PRIVATE);
    }

    ...//Rest of your code.

}

ログインアクティビティ。

appPreferences = new AppPreferences(this);
于 2013-03-06T15:55:51.043 に答える
1

Activity クラスを拡張するクラスのオブジェクトを作成しようとしているためです。AppPreferences が Activity クラスでない場合は、SharedPreferences 関連のコードを別の Java クラスで分離するために、現在の Activity コンテキストを次のように渡すだけです。

public class AppPreferences  
{
    private SharedPreferences settings = null;
    Context context;
    public AppPreferences(Context context){
     this.context=context;
     settings = context.getSharedPreferences(LOGIN_CREDENTIALS, MODE_PRIVATE);
    }
//your code here....

}

AppPreferencesコンストラクターを次のように使用してアクティビティ コンテキストを渡すようになりました。

appPreferences = new AppPreferences(LoginActivity.this);
String email = appPreferences.getPreferenceString("email");
于 2013-03-06T15:56:54.537 に答える