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>
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
@ tjm1706 context.getSharedPreferences ("my_preferences", MODE_PRIVATE) est ce que vous devriez appeler. Si cela ne fonctionne pas, le problème est ailleurs – X3Btel
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