2017-06-02 60 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