动态设置 SharedPreferences 名称

问题描述 投票:0回答:2

我正在使用这个序列来设计应用程序:

(此类不会改变,我将使用它们进行多种活动)

  1. 定制适配器
  2. 模型类
  3. 共享偏好设置

Activity
带有选项卡布局(带有两个片段),其中包含:

我将其命名为:(包#1)

  • 主要活动
  • 片段一
  • 片段二

现在我想复制Package #1并更改一些内容,然后将其命名为Package #2。但我这里有一个问题。

我正在对包 #1、包 #2、包 #3 使用一个共享首选项,对吧? 请查看我的共享偏好类:

public class SharedPreference_light {

    private SharedPreferences settings;
    private SharedPreferences.Editor editor;
    private Gson gson = new Gson();

    private static final String PREFS_NAME = "Light_Products";
    private static final String FAVORITES = "Favorite_Tones_Light";



    public SharedPreference_light(Context context) {
        settings = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
        editor = settings.edit();
    }

    private void saveFavorites(List<ProductLocal> favorites) {
        String jsonFavorites = gson.toJson(favorites);
        editor.putString(FAVORITES, jsonFavorites);
        editor.apply();
    }

    public void addFavorite(ProductLocal product) {
        List <ProductLocal> favorites = getFavorites();
        if (favorites == null)
            favorites = new ArrayList<>();
        favorites.add(product);
        saveFavorites(favorites);
    }

    public void removeFavorite(ProductLocal product) {
        ArrayList <ProductLocal> favorites = getFavorites();
        if (favorites != null) {
            favorites.remove(product);
            saveFavorites(favorites);
        }
    }

    public ArrayList <ProductLocal> getFavorites() {
        List<ProductLocal> favorites;
        if (settings.contains(FAVORITES)) {
            String jsonFavorites = settings.getString(FAVORITES, null);
            ProductLocal[] favoriteItems = gson.fromJson(jsonFavorites, ProductLocal[].class);
            favorites = Arrays.asList(favoriteItems);
            favorites = new ArrayList <> (favorites);
        } else
            return null;

        return (ArrayList <ProductLocal> ) favorites;
    }
}

问题是如果我使用这两个变量:

private static final String PREFS_NAME = "Light_Products";
private static final String FAVORITES = "Favorite_Tones_Light";

这些包之间会有冲突。因为我要将一些列表项添加到共享首选项中并使用

getSharedPreferences
。然后来自多个包的所有这些项目将被添加到一个共享首选项中,我不希望这样。

现在我真正的问题是:

如何动态设置共享首选项名称(变量)?

注: 我在自定义适配器中使用了共享首选项的一种用法:

private boolean checkFavoriteItem(ProductLocal checkProduct) {
    boolean check = false;
    List<ProductLocal> favorites = sharedPreference.getFavorites();
    if (favorites != null) {
        for (ProductLocal product : favorites) {
            if (product.equals(checkProduct)) {
                check = true;
                break;
            }
        }
    }
    return check;
}

适配器:

public class LocalAdapter extends RecyclerView.Adapter<LocalAdapter.MyViewHolder>{

private SharedPreference_light sharedPreference;


public LocalAdapter(Activity activity, List<ProductLocal> dataList, RelativeLayout snackLayout) {
    this.snackLayout=snackLayout;
    this.activity = activity;
    this.dataList = dataList ;
    this.dataListFilter = dataList ;
    sharedPreference = new SharedPreference_light(activity);
    methods = new Methods(activity);
}
android android-fragments sharedpreferences adapter
2个回答
3
投票

首先您想使用提供包名称的界面:

public interface LightPrefs {

    String getPackageName();
}

其次,您可以重用您的类并使其实现以前的接口,但使其抽象:

public abstract class SharedPreference_light implements LightPrefs {

    private SharedPreferences settings;
    private SharedPreferences.Editor editor;

    protected final String PREFS_NAME = "Light_Products_" + getPackageName();
    protected final String FAVORITES = "Favorite_Tones_Light_" + getPackageName();

    public SharedPreference_light(Context context) {
        settings = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
        editor = settings.edit();
    }

    private void saveFavorites(List<ProductLocal> favorites) {
        String jsonFavorites = gson.toJson(favorites);
        editor.putString(FAVORITES, jsonFavorites);
        editor.apply();
    }

    public void addFavorite(ProductLocal product) {
        List <ProductLocal> favorites = getFavorites();
        if (favorites == null)
        favorites = new ArrayList<>();
        favorites.add(product);
        saveFavorites(favorites);
    }

    public void removeFavorite(ProductLocal product) {
        ArrayList <ProductLocal> favorites = getFavorites();
        if (favorites != null) {
            favorites.remove(product);
            saveFavorites(favorites);
        }
    }

}

特别注意一些发生变化的可见性修饰符。 最后在你的包中扩展这个抽象类:

public class SharedPreference_package1 extends SharedPreference_light {

    private static final String TAG = "SharedPref_package1";

    public SharedPreference_package1(Context context) {
        super(context);
        Log.d(TAG, PREFS_NAME);
    }

    @Override
    public String getPackageName() {
        return "package#1";
    }
}

和:

public class SharedPreference_package2 extends SharedPreference_light {

    private static final String TAG = "SharedPref_package2";

    public SharedPreference_package2(Context context) {
        super(context);
        Log.d(TAG, PREFS_NAME);
    }

    @Override
    public String getPackageName() {
        return "package#2";
    }
}

实例化这两个类会给出以下日志:

D/SharedPref_package1: Light_Products_package#1
D/SharedPref_package2: Light_Products_package#2

关于适配器,我认为你应该在构造时指定共享首选项对象:

public class LocalAdapter extends RecyclerView.Adapter<LocalAdapter.MyViewHolder>{

private SharedPreference_light sharedPrefs;

public LocalAdapter(Activity activity, List<ProductLocal> dataList, RelativeLayout snackLayout, SharedPreference_light sharedPrefs) {
    this.snackLayout=snackLayout;
    this.activity = activity;
    this.dataList = dataList ;
    this.dataListFilter = dataList ;
    this.sharedPrefs = sharedPrefs;
    methods = new Methods(activity);
}

因此您可以在包 #1 中像这样初始化适配器:

SharedPreference_package1 sharedPrefs = new SharedPreference_package1();

LocalAdapter adapter = new LocalAdapter(activity, dataList, snackLayout, sharedPrefs);

您可以在第二个包中使用 SharedPreference_package2 进行适配。

希望这对您有帮助。


0
投票

使您的所有方法都将共享首选项键作为参数,例如:

public SharedPreference_light(Context context, String name);
private void saveFavorites(List<ProductLocal> favorites, String name);
public void addFavorite(ProductLocal product, String name);
public void removeFavorite(ProductLocal product, String name);
public ArrayList <ProductLocal> getFavorites(String name);
© www.soinside.com 2019 - 2024. All rights reserved.