如何保存和获取存储在共享首选项中的包名称?
Posted
技术标签:
【中文标题】如何保存和获取存储在共享首选项中的包名称?【英文标题】:How can i save and get the package names stored in shared preference? 【发布时间】:2020-01-12 23:52:14 【问题描述】:我有已安装应用程序的列表,当我单击其中任何一个时,我可以获得单击的应用程序的包名称,现在我想将单击的包名称保存在字符串的 ArrayList 中,使用 Gson 到 SharedPreferences。并获取保存的包名。
我检查了一些以前的答案,但没有得到我想要的解决方案。
这是我要保存被点击应用的包名的代码。
String ApplicationPackageName = adapter.stringList.get(position);
SharedPreferences sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
Gson gson = new Gson();
String json = gson.toJson(ApplicationPackageName);
editor.putString("task list", json);
editor.apply();
这是我要获取保存的包名称的代码。
SharedPreferences sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE);
Gson gson = new Gson();
String json = sharedPreferences.getString("task list", null);
Type type = new TypeToken<ArrayList<String>>() .getType();
arrayList = gson.fromJson(json, type);
if (arrayList == null)
arrayList = new ArrayList<>();
但是我收到了这个错误。 Caused by: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 2 path $
有什么帮助吗?
【问题讨论】:
它会在哪一行崩溃? 参考此链接***.com/questions/7057845/… @just_user 这一行崩溃了`arrayList = gson.fromJson(json, type);` 我想我刚刚看到了问题:String ApplicationPackageName = adapter.stringList.get(position);
这已经是一个字符串了。因此,您在 sharedpreferences 中存储的不是 json 数组。在String json = sharedPreferences.getString("task list", null);
这一行放一个断点或一条日志消息,看看你得到的值。
@just_user 我得到了这个“任务列表”。我怎样才能得到包名呢?
【参考方案1】:
在您的构建中,请添加 gradle
实现'com.google.code.gson:gson:2.8.5'
那么请检查下面的代码。
package testproject.etisatlat.com.test;
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
public class MainActivity extends AppCompatActivity
RecyclerView recyclerView;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
List<String> test=new ArrayList<>();
test.add("a");
test.add("b");
test.add("c");
savePackages(test,"SAVE_LIST");
List<String> savedList=getPackagesList("SAVE_LIST");
public void savePackages(List<String> packagesList, String key)
SharedPreferences SharedPreferences= getSharedPreferences("APP_SHARED_PREFS", Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = SharedPreferences.edit();
Gson gson = new Gson();
String json = gson.toJson(packagesList);
editor.putString(key, json);
editor.apply();
public List<String> getPackagesList(String key)
SharedPreferences SharedPreferences= getSharedPreferences("APP_SHARED_PREFS", Activity.MODE_PRIVATE);
Gson gson = new Gson();
String json = SharedPreferences.getString(key, null);
Type type = new TypeToken<ArrayList<String>>() .getType();
return gson.fromJson(json, type);
【讨论】:
'getDefaultSharedPreferences(android.content.Context)' 已弃用 嘿,@ismail 请再次检查我的答案。 谢谢兄弟,在 logcat 中显示数据已保存,但在共享 pref.xml 中我看不到保存的数据,第二个方法()在最后一行之前显示错误。 hey@ismail 请再次检查我的答案 我分享了完整代码。以上是关于如何保存和获取存储在共享首选项中的包名称?的主要内容,如果未能解决你的问题,请参考以下文章
如何将对象列表中的布尔收藏夹保存到 Flutter 中的共享首选项