我正在尝试制作收藏列表。
我创建一个存储真值的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()我尝试在声明从Fragment扩展的Favorite类中声明的New public ArrayList<String> fav_list;
。
这一步都很好! ,但是在Favorite片段类中,我的fav_list
ArrayList是空的 - 我之前使用这种方式(但是在活动中,而不是片段)并且正常工作但在片段类中不起作用;
首先,我调用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 ... )
修改:
所以,我试试this link.
答案 0 :(得分:3)
Bundles可以接受自定义类,如果它们实现了Parcelable或Serializable ..
例如
Bundle bundle = new Bundle();
bundle.putSerializable("MyData", data);
fragment_one.setArguments(bundle);
现在,fragment_one可以访问其onCreate(Bundle bundleHoldingData)方法中的数据。
答案 1 :(得分:1)
您的getall()
方法通过调用Favorite
创建新的new
。如果Favorite
确实是Fragment
,那么它将不会通过其onCreate
,因此它不会被初始化。
答案 2 :(得分: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();
答案 3 :(得分:-1)
您的代码中有一些我不理解。首先,你有一个很酷的共享优先助理课程,但你的课程不仅仅是放置和返回数据而且还不酷!你的类想要处理两个完全分离的东西,这在面向对象的编程中是不对的。 在getAll方法中你定义了一个片段,但你什么也没做!我不明白为什么?如果你想要一个片段,你应该返回它,之后你可以将它传递给fragmentManger并以某种方式使用它。
我推荐的方法是不要在你的类中处理片段。只需将数据作为数组或arrayList返回。你也可以让你的班级和里面的每一个方法都是静态的!然后使用片段管理器(甚至从布局)将您的片段添加到应用程序,并在片段内部使用getAll方法并初始化所需的一切。