2011-01-16 6 views
6

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)

risposta

3

Nella onCreate() tuo ritorno prima di eseguire questa linea, in modo da Eclipse dice che è irraggiungibile . Nel vostro onClick() prova:

SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(mContext); 

dovrebbe essere OK

+0

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

+0

Una volta che un metodo ritorna, non è possibile eseguire più codice dopo questo ... – Falmarri

+0

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

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

Ho provato anche quello. Nel codice onCreate(), Eclipse dice che è "codice irraggiungibile" e raccomanda di eliminare l'intera riga. Nel mio codice onClick(), lo stesso errore di prima rimane. – Ronnie