Attualmente ho una schermata delle preferenze e ho creato una classe personalizzata che estende DialogPreference
e viene richiamata dalle mie Preferenze. I miei dati di preferenze sembrano memorizzare/recuperare da SharedPreferences
senza problemi, ma sto cercando di aggiungere altri 2 set di impostazioni da DialogPreference
.Salvataggio in SharedPreferences da DialogPreference personalizzato
Fondamentalmente ho due problemi che non sono stato in grado di trovare. Ogni sito che ho visto mi dà le stesse informazioni standard per salvare/ripristinare i dati e sto ancora avendo problemi. Innanzitutto sto cercando di salvare un nome utente e una password nel mio SharedPreferences
(visibile nell'ultimo blocco di codice) e, se possibile, mi piacerebbe essere in grado di farlo nello onClick()
.
le mie preferenze XML che chiama il mio DialogPreference
:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory>
<com.rone.optusmon.AccDialog
android:key="AccSettings"
android:title="Account Settings"
android:negativeButtonText="Cancel"
android:positiveButtonText="Save" />
</PreferenceCategory>
</PreferenceScreen>
Il mio file personalizzato Classe DialogPreference:
package com.rone.optusmon;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.preference.DialogPreference;
import android.preference.PreferenceManager;
import android.text.method.PasswordTransformationMethod;
import android.util.AttributeSet;
import android.view.View;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
public class AccDialog extends DialogPreference implements DialogInterface.OnClickListener {
private TextView mUsername, mPassword;
private EditText mUserbox, mPassbox;
CharSequence mPassboxdata, mUserboxdata;
private CheckBox mShowchar;
private Context mContext;
private int mWhichButtonClicked;
public AccDialog(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
}
@Override
protected View onCreateDialogView() {
// Access default SharedPreferences
@SuppressWarnings("unused")
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(mContext);
@SuppressWarnings("unused")
LinearLayout.LayoutParams params;
LinearLayout layout = new LinearLayout(mContext);
layout.setOrientation(LinearLayout.VERTICAL);
layout.setPadding(10, 10, 10, 10);
layout.setBackgroundColor(0xFF000000);
mUsername = new TextView(mContext);
mUsername.setText("Username:");
mUsername.setTextColor(0xFFFFFFFF);
mUsername.setPadding(0, 8, 0, 3);
mUserbox = new EditText(mContext);
mUserbox.setSingleLine(true);
mUserbox.setSelectAllOnFocus(true);
mPassword = new TextView(mContext);
mPassword.setText("Password:");
mPassword.setTextColor(0xFFFFFFFF);
mPassbox = new EditText(mContext);
mPassbox.setSingleLine(true);
mPassbox.setSelectAllOnFocus(true);
mShowchar = new CheckBox(mContext);
mShowchar.setOnCheckedChangeListener(mShowchar_listener);
mShowchar.setText("Show Characters");
mShowchar.setTextColor(0xFFFFFFFF);
mShowchar.setChecked(false);
if(!mShowchar.isChecked()) {
mPassbox.setTransformationMethod(new PasswordTransformationMethod());
}
layout.addView(mUsername);
layout.addView(mUserbox);
layout.addView(mPassword);
layout.addView(mPassbox);
layout.addView(mShowchar);
return layout;
}
public void onClick(DialogInterface dialog, int which) {
mWhichButtonClicked = which;
// if statement to set save/cancel button roles
if (mWhichButtonClicked == -1) {
Toast.makeText(mContext, "Save was clicked\nUsername: " + mUserbox.getText().toString() +"\nPassword is: " + mPassbox.getText().toString(), Toast.LENGTH_SHORT).show();
// Save user preferences
SharedPreferences settings = getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = settings.edit();
editor.putString("usernamekey", mUserbox.getText().toString());
editor.putString("passwordkey", mPassbox.getText().toString());
editor.commit();
}
else {
Toast.makeText(mContext, "Cancel was clicked", Toast.LENGTH_SHORT).show();
}
}
}
mio codice di prova principale attività:
public void onResume() {
super.onResume();
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
StringBuilder builder = new StringBuilder();
builder.append("\nThe monitor will refresh every "+ pref.getString("refreshfreq", "30 minutes"));
builder.append("\nThe skin chosen is "+ pref.getString("skinkey", "null"));
builder.append("\nThe style chosen is "+ pref.getString("stylekey", "% used"));
builder.append("\nThe font chosen is "+ pref.getString("fontkey", "Calibri"));
builder.append("\nThe font color is "+ pref.getString("fontcolkey", "White"));
builder.append("\nYour username is "+ pref.getString("usernamekey", "not set yet"));
builder.append("\nYour password is "+ pref.getString("passwordkey", "not set yet"));
Toast.makeText(Optusmon.this, builder.toString(), Toast.LENGTH_LONG).show();
}
Nella mia linea SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
, Eclipse dice "Il metodo getDefaultSharedPreferences (AccD ialog) non è definito per il tipo AccDialog ". Ho provato a cambiare il contesto alla mia classe di preferenze, usare un contesto vuoto e ho anche provato a nominare il mio SharedPrefs e ad usare anche getSharedPreferences()
. Non sono proprio sicuro di quello che sto facendo qui.
Dato che sono abbastanza nuovo in Java/Android/codifica in generale, potresti essere il più dettagliato possibile con qualsiasi aiuto, ad es. quale dei miei file ho bisogno di scrivere il codice e il luogo in quel file occorre scriverlo (cioè onCreate()
, onClick()
, ecc)
Non pensavo che avrebbe fatto la differenza dopo il 'layout di ritorno' come era al di fuori del layout a prescindere, ma l'ho spostato sulla riga dopo "protected View onCreateDialogView() {" e il problema è scomparso. Ha inoltre risolto il mio problema nel blocco onClick(). Grazie – Ronnie
Una volta che un metodo ritorna, non è possibile eseguire più codice dopo questo ... – Falmarri
Ah ok. Ho trovato un altro problema dopo l'implementazione di questa correzione e ho modificato il codice precedente e ho aggiunto un paragrafo in fondo per spiegarlo. Ancora non sembra che stia salvando come previsto, oppure lo è, ma non lo sto leggendo correttamente. – Ronnie