2011-01-16 12 views
6

Mam obecnie ekran preferencji i utworzyłem niestandardową klasę, która rozszerza DialogPreference i jest wywoływana z poziomu moich Preferencji. Moje dane preferencji wydają się przechowywać/pobierać z SharedPreferences bez problemu, ale próbuję dodać 2 dodatkowe zestawy ustawień z DialogPreference.Zapisywanie do SharedPreferences z niestandardowego DialogPreference

Zasadniczo mam dwa problemy, których nie mogłem znaleźć. Każda witryna, którą widziałem, podaje mi te same standardowe informacje, aby zapisać/przywrócić dane i nadal mam problemy. Po pierwsze próbuję zapisać nazwę użytkownika i hasło do mojego SharedPreferences (widoczne w ostatnim bloku kodu) i jeśli to możliwe, chciałbym móc to zrobić w onClick().

Moje preferencje XML, który wywołuje mój 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> 

Mój plik klienta DialogPreference Klasa:

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(); 
    } 
} 
} 

Główny kod test aktywności:

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(); 

    } 

W moim SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this); linii, Eclipse mówi "Metoda getDefaultSharedPreferences (AccD ialog) jest niezdefiniowany dla typu AccDialog ". Podjęto próbę zmiany kontekstu na moją klasę preferencji, użycia pustego kontekstu i próbowałem również nazywać moje SharedPrefs i używać również getSharedPreferences(). Po prostu nie jestem do końca pewien, co tu robię.

Ponieważ jestem całkiem nowym użytkownikiem języka Java/Android/kodowania w ogóle, proszę o jak najdokładniejszą pomoc, np. który z moich plików muszę napisać kod i pobytu w tym pliku powinienem napisać go (tzn onCreate(), onClick() itp)

Odpowiedz

3

W onCreate() wrócisz przed wykonaniem tej linii, więc Eclipse mówi, że jest nieosiągalny . W swojej próbie onClick():

SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(mContext); 

powinno być OK

+0

Nie sądziłem, że zmiana będzie miała miejsce po "układzie zwrotnym", ponieważ znajdowała się poza układem, ale przesunąłem go do linii po "chronionym widoku onCreateDialogView() {" i problem zniknął. Rozwiązał również mój problem w bloku onClick(). Dziękujemy – Ronnie

+0

Po powrocie metody nie można wykonać więcej kodu po tym ... – Falmarri

+0

Ah ok. Po wdrożeniu tej poprawki napotkałem inny problem i edytowałem powyższy kod i dodałem akapit na dole, aby to wyjaśnić. Nadal wydaje się, że nie oszczędza się zgodnie z przeznaczeniem, albo jest, ale nie czytam tego poprawnie. – Ronnie

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

Próbowałem, że dobrze. W kodzie onCreate() Eclipse mówi, że jest to "nieosiągalny kod" i zaleca usunięcie całej linii. W moim kodzie onClick() pozostaje ten sam błąd co poprzednio. – Ronnie

Powiązane problemy