2011-01-16 8 views
6

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)

Respuesta

3

En el onCreate() que regresó antes de ejecutar esta línea, por lo que Eclipse dice que es inalcanzable . En su intento onClick():

SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(mContext); 

debe estar bien

+0

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

+0

Una vez que un método retorna, no puede ejecutar más código después de eso ... – Falmarri

+0

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

0
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(mContext); 
+0

lo he intentado también. En el código onCreate(), Eclipse dice que es un "código inalcanzable" y recomienda que elimine toda la línea. En mi código onClick(), el mismo error que antes permanece. – Ronnie

Cuestiones relacionadas