2017-06-02 25 views
0

我用这个序列设计的应用程序:集SharedPreferences动态命名

(本类不会改变,我会使用他们的多项活动)

  1. 定义适配器
  2. 模型类
  3. 共享偏好

而且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); 
} 
+0

只需将'Name'添加到您的自定义适配器,稍后将该'Name'路由到共享首选项。 – Dusan

回答

3

first您想使用的接口提供的软件包名称:

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

感谢您的答复,在我的适配器中,有一个共享首选项的用法,这意味着根据您的答案通过初始化'SharedPreference_light'类我必须'@ Override' getPackageName那里。 – DastakWall

+0

什么应该是那里的返回值......并且这两个片段也初始化'SharedPreference_light' – DastakWall

+0

请仔细看看,在我的答案中'SharedPreference_light'是一个抽象类,所以它不需要重写'getPackageName()'方法。 同样在你的片段中,你会想要使用'SharedPreference *'与片段所在的包相关。例如,包#1中的一个片段应该使用'SharedPreferencePackage1'来覆盖'getPackageName()'返回“package1”。 – Wang

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

我想过这个,但在我最后的笔记中,我提到了适配器类中共享首选项的用法。根据你的回答,它会变成这样:'List favorites = sharedPreference.getFavorites(String name);' – DastakWall

+0

我对所有新软件包都使用一个适配器,但是,我需要添加一个动态参数在该方法 – DastakWall