Android Fragments 动态设置SharedPreferences名称

bwitn5fc  于 9个月前  发布在  Android
关注(0)|答案(2)|浏览(87)

我正在使用这个序列来设计一个应用程序:
(This类不会改变,我将使用它们进行多个活动)
1.自定义适配器
1.模型类
1.共享首选项
Activity与选项卡布局(有两个片段),其中包含:
我给它命名为:(套餐#1)

  • MainActivity
  • 第一章碎片
  • 第一百二十二章碎片二

现在我想复制 * 包#1*,并更改一些内容,然后将其命名为包#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);
}
sxissh06

sxissh061#

首先,你想使用一个接口提供软件包名称:

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进行调整。
希望这对你有帮助。

qaxu7uf2

qaxu7uf22#

Make your all方法将shared preferences key作为参数,如:

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);

相关问题