Actualmente tengo una pantalla de preferencias, y he creado una clase personalizada que se extiende a DialogPreference
y se llama desde mis Preferencias. Mis datos de preferencias parecen almacenar/recuperar desde SharedPreferences
sin problemas, pero estoy tratando de agregar 2 conjuntos más de configuraciones desde DialogPreference
.Guardar en SharedPreferences desde la aplicación DialogPreference personalizada
Básicamente tengo dos problemas que no he podido encontrar. Todos los sitios que he visto me dan la misma información estándar para guardar/restaurar datos y sigo teniendo problemas. En primer lugar, estoy tratando de guardar un nombre de usuario y contraseña en mi SharedPreferences
(visible en el último bloque de código) y, si es posible, me gustaría poder hacerlo en el onClick()
.
mis preferencias XML que llama mi 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>
Mi archivo personalizado DialogPreference Clase:
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();
}
}
}
Mi principal código de prueba de actividad:
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();
}
En mi línea SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
, Eclipse dice "El método getDefaultSharedPreferences (AccD ialog) no está definido para el tipo AccDialog ". Intenté cambiar el contexto a mi clase de preferencias, usar un contexto en blanco y también intenté nombrar mis SharedPrefs y también el getSharedPreferences()
. No estoy seguro exactamente de lo que estoy haciendo aquí.
Como soy bastante nuevo en Java/Android/codificación en general, ¿podría por favor ser lo más detallado posible con cualquier ayuda, por ejemplo. cuál de mis archivos tengo que escribir el código y el paradero de ese archivo debo escribirlo (es decir onCreate()
, onClick()
, etc)
No pensé que hubiera una diferencia después del 'diseño de retorno', ya que estaba fuera del diseño, pero lo moví a la línea después de "proteger View onCreateDialogView() {" y el problema desapareció. También resolvió mi problema en el bloque onClick(). Gracias – Ronnie
Una vez que un método retorna, no puede ejecutar más código después de eso ... – Falmarri
Ah ok. Me encontré con otro problema después de implementar esta corrección y edité el código anterior y agregué un párrafo en la parte inferior para explicarlo. Todavía no parece estar guardando como se pretendía, o de lo contrario, pero no lo estoy leyendo correctamente. – Ronnie