如何使用 SharedPreferences 存储片段列表

how to store list of fragments using SharedPreferences

我正在使用 SharedPreferences 来存储我的 android 的片段列表,但是它给了我数千行毫无意义的错误:

2021-12-07 17:09:13.228 14833-14833/? E/AndroidRuntime: 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:245) 在 com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:127) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:245) 在 com.google.gson.Gson$FutureTypeAdapter.write(Gson.java:1058) 在......

(只是错误信息的一小部分) 我试图存储一个字符串列表,它工作正常,但如果我切换到一个包含片段列表的对象,它会失败。

这是我的 object.java:

public class CardList {
    ArrayList<Card> list;  //Card is my fragments
    public CardList(ArrayList<Card> list) {
        this.list = list;
    }
    public void updateList(Card c) {
        list.add(c);
    }

    public int getListSize() {
        return list.size();
    }


}

这是我的 MainActivity.java,这里的新意图只是测试当我回到 MainActivity 时是否可以取回我的数据

public class MainActivity extends AppCompatActivity {

    public static final String WEATHER_PREFS = "weatherPrefs";
    public CardList cardList;
    public ArrayList<Card> cards;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

       
        cards = new ArrayList<>();
        cardList = new CardList(cards);

        SharedPreferences setting = getSharedPreferences(WEATHER_PREFS,MODE_PRIVATE);
        Gson gson = new Gson();
        String savedList = setting.getString("cardList","");

        if (!savedList.equals("")) {
            cardList = gson.fromJson(savedList,CardList.class);
        }


        Button btn= findViewById(R.id.switchActtivity);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this,SecondActivity.class);
                Gson gson = new Gson();

                String savedInstanceString = gson.toJson(cardList);
                SharedPreferences setting = getSharedPreferences(WEATHER_PREFS,MODE_PRIVATE);
                SharedPreferences.Editor editor = setting.edit();
                editor.putString("cardList",savedInstanceString);
                editor.apply();
                startActivity(intent);
            }
        });
        Button increase = findViewById(R.id.increase);
        increase.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                cardList.updateList(Card.newInstance("hello","world"));
                Log.i("Array List Size After Click",String.valueOf(cardList.getListSize()));
            }
        });


    }
    
}

谁能教我如何在 Android 中存储带有 arraylist 属性的自定义对象?提前致谢!

Fragment 不是 serializable,这意味着它们不能分解为纯数据,即 JSON,更不用说 deserializable.

看看你的代码,也没有什么好办法让它工作。

您需要遵循关注点分离,Fragment是美化的观点。他们不应该在很大程度上持有信息,所以他们不应该像他们那样被传递。

您可以做的是拥有一个 CardModel,其中包含 Card Fragment.

所需的所有信息

CardModel 可以包含您可以在 JSON 中找到的简单数据,例如 IntegerString 等...

一个List<CardModel>可以从JSON变成deserialized。然后当你在 MainActivity 中时,你可以根据需要创建尽可能多的 Card Fragment 来用简单的 list.size()[=30 表示 List<CardModel> =]