0

Pour cette opportunité, j'ai besoin d'utiliser des données de préférences partagées non définies par défaut (c'est-à-dire personnalisées). Comment puis-je accéder à ces données de préférences partagées personnalisées dans une disposition de préférence personnalisée? Dans ce cas, je ne peut pas utiliser getDefaultSharedPreferences (contexte);Android: comment utiliser la préférence partagée (données) non définie par défaut dans les préférences personnalisées (disposition)

J'ai créé une liste personnalisée qui permet d'ajouter de nouveaux éléments. Je devais travailler avec Android 4. Pour cette question, ce n'est pas très important. MainActivity simple affiche simplement la liste de préférences avec seulement 1 disposition de préférence personnalisée.

public class MainActivity extends PreferenceActivity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     PreferenceManager prefMgr = getPreferenceManager(); 
     prefMgr.setSharedPreferencesName("my_preferences"); 
     prefMgr.setSharedPreferencesMode(MODE_PRIVATE); 
     try { 
      addPreferencesFromResource(R.xml.preferences); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

La res/xml/fichier preferences.xml contient:

<nl.xyz.listpreferenceexpandable.ListPreferenceExpandable 
     android:key="custom3" 
     android:title="CustomList3" 
     android:dialogTitle="Add custom item" 
     android:entries="@array/customdata1" 
     android:entryValues="@array/customdata1"/> 

Le code ListPreference personnalisé est illustré ci-dessous. La question est: comment puis-je accéder aux données de préférences partagées personnalisées avec le nom "my_preferences"? Quand j'appelle juste un getPreferenceManager() alors j'obtiens null.

public class ListPreferenceExpandable extends ListPreference { 
    CustomListPreferenceAdapter customListPreferenceAdapter = null; 
    Context mContext; 
    private LayoutInflater mInflater; 
    List<String> entries; 
    ArrayList<RadioButton> rButtonList; 
    SharedPreferences prefs; 
    SharedPreferences.Editor editor; 
    String current; 
    String keyDefault; 
    String keyData; 

    public ListPreferenceExpandable(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     mContext = context; 
     mInflater = LayoutInflater.from(context); 
     rButtonList = new ArrayList<RadioButton>(); 
     // THIS IS WRONG: 
     prefs = PreferenceManager.getDefaultSharedPreferences(context); 
     // QUESTION: How can I access SharedPreference "my_preferences" 
     editor = prefs.edit(); 
     keyDefault = getKey(); 
     keyData = getKey() + "_data"; // will hold the dynamically data   
     String prefDefault = getPersistedString(getKey()); 
     current = prefs.getString(keyDefault, prefDefault); 
     setSummary(current); 
    } 

    @Override 
    protected void onPrepareDialogBuilder(Builder builder) { 
     getData(); 
     customListPreferenceAdapter = new CustomListPreferenceAdapter(mContext); 
     builder.setAdapter(customListPreferenceAdapter, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       System.out.println("Clicked ... on " + which); 
      } 
     }); 
     builder.setNeutralButton("Add", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       inputDialog("Add new entry"); 
      } 
     }); 
    } 

    private void getData() { 
     String data = prefs.getString(keyData, ""); 
     if(data.isEmpty()) { 
      entries = new ArrayList<>(); 
      CharSequence[] loadedFromTheResource = getEntries(); 
      if(loadedFromTheResource == null || loadedFromTheResource.length < 1) { 
       loadedFromTheResource = getEntryValues(); 
      } 
      if(loadedFromTheResource != null && loadedFromTheResource.length > 0) { 
       for (CharSequence cs : loadedFromTheResource) { 
        entries.add(cs.toString()); 
       } 
      } 
     } else { 
      String[] loaded = data.split("\\s*#\\s*"); 
      if(loaded != null && loaded.length > 0) { 
       entries = Arrays.asList(loaded); 
       entries = new ArrayList<>(entries); 
      } 
     } 
     if(entries.isEmpty()) { 
      entries.add(current); 
     } 
    } 
    private void saveData() { 
     SharedPreferences.Editor editor = prefs.edit(); 
     editor.putString(keyData, TextUtils.join("#", entries)); 
     editor.apply(); 
    } 

    void inputDialog(String title) { 
     Builder builder = new Builder(mContext); // this 
     builder.setTitle(title); 
     final EditText input = new EditText(mContext); // this 
     input.setInputType(InputType.TYPE_CLASS_TEXT); 
     builder.setView(input); 
     builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       String newEntry = input.getText().toString(); 
       entries.add(newEntry); 
       customListPreferenceAdapter.notifyDataSetChanged(); 
       saveData(); 
      } 
     }); 
     builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       dialog.cancel(); 
      } 
     }); 
     builder.show(); 
    } 

    static class ViewHolder { 
     protected TextView nameT = null; 
     protected TextView formulaT = null; 
    } 

    private class CustomListPreferenceAdapter extends BaseAdapter { 
     private int mSelectedPosition = -1; 
     private RadioButton mSelectedRB; 

     public CustomListPreferenceAdapter(Context context) { } 
     public int getCount() { 
      return entries.size(); 
     } 
     public Object getItem(int position) { 
      return position; 
     } 
     public long getItemId(int position) { 
      return position; 
     } 

     public View getView(final int position, View convertView, ViewGroup parent) { 
      View row = convertView; 
      CustomHolder holder; 
      if(convertView == null) { 
       row = mInflater.inflate(R.layout.custom_list_preference_row, parent, false); 
       holder = new CustomHolder(row, position); 
       row.setTag(holder); 
      } else { 
       holder = (CustomHolder) row.getTag(); 
      } 
      holder.row.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        String current = entries.get(position).toString(); 
        editor.putString(keyDefault, current).apply(); 
        setSummary(current); 
        Dialog mDialog = getDialog(); 
        mDialog.dismiss(); 
       } 
      }); 
      String currentSelection = prefs.getString(keyDefault, ""); 
      if(entries.get(position).equals(currentSelection)) { 
       holder.rButton.setChecked(true); 
      } else { 
       holder.rButton.setChecked(false); 
      } 
      holder.text.setText(entries.get(position)); 
      return row; 
     } 

     class CustomHolder { 
      private TextView text = null; 
      private RadioButton rButton = null; 
      private View row = null; 

      CustomHolder(View row, int position1) { 
       text = (TextView)row.findViewById(R.id.custom_list_view_row_text_view); 
       rButton = (RadioButton)row.findViewById(R.id.custom_list_view_row_radio_button); 
       this.row = row; 
      } 
      public RadioButton getRadioButton() { 
       return rButton; 
      } 
     } 
    } 
} 

Dans arrays.xml "tableau @/customdata1" est juste:

<string-array name="customdata1"> 
    <item name="One">One</item> 
    <item name="Two">Two</item> 
</string-array> 

La ligne est:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/custom_list_view_row_table_row" 
    android:orientation="horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:paddingBottom="8dip" 
    android:paddingTop="8dip" 
    android:paddingLeft="10dip" 
    android:paddingRight="10dip"> 

    <TextView 
     android:id="@+id/custom_list_view_row_text_view" 
     android:textSize="22sp" 
     android:textColor="#000000" 
     android:gravity="center_vertical" 
     android:layout_width="0dp" 
     android:layout_weight="1" 
     android:layout_height="wrap_content" /> 

    <RadioButton 
     android:checked="false" 
     android:layout_width="40dp" 
     android:layout_weight="0" 
     android:layout_height="wrap_content" 
     android:layout_gravity="right" 
     android:id="@+id/custom_list_view_row_radio_button"/> 

</LinearLayout> 

Répondre

0

@ X3Btel, merci de m'avoir montré le chemin.

Le ListPreferenceExpandable personnalisé doit être réutilisé plusieurs fois. L'ancienne application utilisait une SharedPreference distincte pour chaque groupe cible différent.

Alors, comment puis-je communiquer le nom de la SharedPreference à ListPreference personnalisé? La méthode la plus simple consistait à créer un fichier distinct.xml distinct pour chaque groupe cible. Dans chaque preference_targetgroup_n.xml, je mets le nom du sharedPreference de ce groupe cible.

preference_targetgropu_n.xml:

<nl.xyz.listpreferenceexpandable.ListPreferenceExpandable 
     android:key="custom3" 
     android:title="CustomList3" 
     android:dialogTitle="Add custom item" 
     android:entries="@array/customdata1" 
**** sharedPreference="sharedpreferences_of_targetgroup_n" **** 
     android:entryValues="@array/customdata1"/> 

Pour rendre mon ListPreference réutilisable dans ce cas, je mets la préférence personnalisée:

String sharedPreference = attrs.getAttributeValue(null, "sharedPreference"); 
if(sharedPreference == null || sharedPreference.isEmpty()) { 
    prefs = PreferenceManager.getDefaultSharedPreferences(context); 
} else { 
    prefs = context.getSharedPreferences(sharedPreference, MODE_PRIVATE); 
} 
1

Pour récupérer non par défaut SharedPreference vous devez appeler getSharedPreferences

+0

Mais comment puis-je accéder à ListPreferenceExpandable les getSharedPreferences? [1] Première tentative: getPreferenceManager(). GetSharedPreferencesName(); Rien n'est montré. [2] Je ne peux pas utiliser context.getSharedPreferences (getPreferenceManager(). GetSharedPreferencesName(), android.content.Context.MODE_PRIVATE); parce que rien n'est montré. [3] getPreferenceManager() donne la valeur null. – tjm1706

+0

@ tjm1706 context.getSharedPreferences ("my_preferences", MODE_PRIVATE) est ce que vous devriez appeler. Si cela ne fonctionne pas, le problème est ailleurs – X3Btel

+0

Oui, je sais. Le problème est que la préférence personnalisée peut être appelée dans différents paramètres. Selon le 'getSharedPreferencesName' actuel, une SharedPreference personnalisée doit être utilisée. Alors, comment puis-je déterminer dans la Préférence personnalisée la SharedPreference non définie par défaut? – tjm1706