0

お気に入りリストを作ろうとしています。

私は真の値を格納する SharedPreferences クラスを作成し、すべての真の値を使用する必要があります。

それは私のクラスです:

public class Baham_SharedPreferences
{

private SharedPreferences prefs;

private static final String NAME = "pref";

public SharedPreferences(Context context) {
    prefs = context.getSharedPreferences(NAME, Context.MODE_PRIVATE);
}

public boolean getState(String key) {
    return prefs.getBoolean(key, false);
}
public void setState(String key, boolean value){
    Editor editor = prefs.edit();
    editor.putBoolean(key, value);
    editor.commit();
}

public void getall()
{
    Favorite favorite=new Favorite(); //Favorite is a fragment class
    favorite.fav_list=new ArrayList<String>();

    Map<String,?> keys = prefs.getAll();
    int i=0;
    for(Map.Entry<String,?> entry : keys.entrySet())
    {
        if (entry.getValue().toString()=="true")
        {
            favorite.fav_list.add(entry.getKey());
            Log.d("true value", favorite.fav_list.get(i));
            i++;
        }
    }
 }  
}

getall() 経由ArrayList<String> fav_list;で Fragment から拡張する Favorite クラスの宣言で宣言された New public を試みます。

すべてがこのステップに適しています! 、しかし、お気に入りのフラグメントクラスでは、fav_listArrayListはまだ空です-以前にこの方法を使用し(ただし、フラグメントではなくアクティビティで)、正しく機能しますが、フラグメントクラスでは機能しません;

まず、preferences.getall() を呼び出してから ArrayList fav_list を使用しますが、次のエラーを返します。

E/AndroidRuntime(10015): FATAL EXCEPTION: main
E/AndroidRuntime(10015): java.lang.NullPointerException
E/AndroidRuntime(10015):    at baham.slidingmenu.Favorite.onCreateView(Favorite.java:52)
E/AndroidRuntime(10015):    at android.app.Fragment.performCreateView(Fragment.java:1695)
E/AndroidRuntime(10015):    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:885)
E/AndroidRuntime(10015):    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1057)
E/AndroidRuntime(10015):    at android.app.BackStackRecord.run(BackStackRecord.java:682)
E/AndroidRuntime(10015):    at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1435)

今!、ArrayList を : のようなクラスpublic class SharedPreferencesn {...}(何からも拡張されていない)からFragment class?に渡す方法はありません。

(For Example via : bundle.putStringArrayList(key, value) , intent.putExtras and ... )

編集 :

だから、私はこのリンクを試します。

4

4 に答える 4

3

バンドルは、Parcelable または Serializable のいずれかを実装する場合、カスタム クラスを受け入れることができます。

例えば

Bundle bundle = new Bundle();
bundle.putSerializable("MyData", data);
fragment_one.setArguments(bundle);

これで、fragment_one はその onCreate(Bundle bundleHoldingData) メソッドでデータにアクセスできるようになります。

于 2014-08-01T12:27:55.223 に答える
1

この方法を試してみてください。これが問題の解決に役立つことを願っています。

public class Baham_SharedPreferences{
     private SharedPreferences prefs;
     private static final String NAME = "pref";

     public Baham_SharedPreferences(Context context) {
        prefs = context.getSharedPreferences(NAME, Context.MODE_PRIVATE);
     }

    public boolean getState(String key) {
       return prefs.getBoolean(key, false);
    }
    public void setState(String key, boolean value){
       SharedPreferences.Editor editor = prefs.edit();
       editor.putBoolean(key, value);
       editor.commit();
    }

    public ArrayList<String> getall(){
       ArrayList<String> fav_list=new ArrayList<String>();
       Map<String,?> keys = prefs.getAll();
       for(Map.Entry<String,?> entry : keys.entrySet()){
          if (entry.getValue().toString().equals("true")){
                fav_list.add(entry.getKey());
          }
       }
      return fav_list;
     }

}

断片

ArrayList<String> favList = new Baham_SharedPreferences(getActivity()).getall();
于 2014-08-01T12:14:39.577 に答える
1

あなたのgetall()メソッドは、Favoriteを呼び出して新しいを作成していnewます。Favoriteが本当に である場合はFragmentonCreateまだ処理されていないため、初期化されません。

于 2014-08-01T12:11:14.480 に答える
-1

あなたのコードには理解できない部分があります。まず、クールな sharedpreferences アシスタント クラスがありますが、このクラスは単にデータを入れて返すだけではなく、クールではありません! あなたのクラスは、オブジェクト指向プログラミングでは正しくない 2 つの完全に分離されたものを処理したいと考えています。getAll メソッドでフラグメントを定義しましたが、それに対して何もしません! 私はなぜ理解できないのですか?フラグメントが必要な場合は、それを返す必要があります。その後、それを fragmentManger に渡して、何らかの方法で使用できます。

私の推奨するアプローチは、クラスでフラグメントを処理しないことです。データを配列または配列リストとして返すだけです。また、クラスとその中のすべてのメソッドを静的にすることもできます! 次に、フラグメントマネージャーを使用して (またはレイアウトから) フラグメントをアプリに追加し、フラグメント内で getAll メソッドを使用して、必要なものをすべて初期化します。

于 2014-08-01T12:10:58.283 に答える