2012-04-04 13 views
10

Ho una configurazione di Preferenze di lavoro lanciata da un'opzione di menu. Nelle preferenze ho impostato una preferenza personalizzata che deve avviare una finestra di dialogo con 3 TextViews per impostare la conferma e modificare una password. Ora non so come avviare la finestra di dialogo da PreferenceActivity onPreferenceClick. Se sembro un newby - Sono, mi dispiace!Come fare un PreferenceActivity lanciare una finestra di dialogo per impostare una preferenza personalizzata

Ecco il mio layout xml per la finestra di pop-up:

<?xml version="1.0" encoding="UTF-8"?> 
<LinearLayout 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    android:orientation="vertical" 
    android:id="@+id/root" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 

    <TextView 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:id="@+id/TextView_Pwd1" 
     android:text="@string/settings_oldpassword" 
     android:textStyle="bold" /> 

    <EditText 
     android:layout_height="wrap_content" 
     android:layout_width="match_parent" 
     android:id="@+id/EditText_OldPwd" /> 

    <TextView 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:id="@+id/TextView_Pwd1" 
     android:text="@string/settings_password" 
     android:textStyle="bold" /> 

    <EditText 
     android:layout_height="wrap_content" 
     android:layout_width="match_parent" 
     android:id="@+id/EditText_Pwd1" 
     android:inputType="textPassword" /> 

    <TextView 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:id="@+id/TextView_Pwd2" 
     android:text="@string/settings_password2" 
     android:textStyle="bold" /> 

    <EditText 
     android:layout_height="wrap_content" 
     android:layout_width="match_parent" 
     android:id="@+id/EditText_Pwd2" 
     android:inputType="textPassword" /> 

    <TextView 
     android:layout_height="wrap_content" 
     android:layout_width="match_parent" 
     android:id="@+id/TextView_PwdProblem" 
     android:textStyle="bold" 
     android:gravity="center" /> 

    <TextView 
     android:id="@+id/TextView_PwdProblem" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:text="@string/settings_pwd_not_equal" /> 

    <CheckBox 
     android:id="@+id/checkShowPwdText" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/settings_showpwd_text" /> 

Ecco la mia classe DialogChangePassword per la finestra di pop-up:

package biz.linsys.package; 

import android.app.Dialog; 
import android.content.Context; 
import android.content.SharedPreferences; 
import android.preference.DialogPreference; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.util.AttributeSet; 
import android.view.View; 
import android.widget.EditText; 
import android.widget.TextView; 

public class DialogChangePassword extends DialogPreference { 

    private String strPass1; 
    private String strPass2; 

    public DialogChangePassword(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     setDialogLayoutResource(R.layout.dialog_pwdchange); 
    } 

    @Override 
    protected void onBindDialogView(View view) { 

     Dialog pwdDialog   = getDialog(); 
     final EditText password1 = (EditText) pwdDialog.findViewById(R.id.EditText_Pwd1); 
     final EditText password2 = (EditText) pwdDialog.findViewById(R.id.EditText_Pwd2); 
     final TextView error  = (TextView) pwdDialog.findViewById(R.id.TextView_PwdProblem);  

     password2.addTextChangedListener(new TextWatcher() { 

      @Override 
      public void afterTextChanged(Editable s) { 

       strPass1 = password1.getText().toString(); 
       strPass2 = password2.getText().toString(); 

       if (strPass1.equals(strPass2)) { 

        error.setText(R.string.settings_pwd_equal); 
       } else { 

        error.setText(R.string.settings_pwd_not_equal); 
       } 
      } public void beforeTextChanged(CharSequence s, int start, int count, int after) {} 
       public void onTextChanged(CharSequence s, int start, int before, int count) {} 
     }); 

     super.onBindDialogView(view); 

    } 

    @Override 
    protected void onDialogClosed(boolean positiveResult) { 

     if(!positiveResult) return; 

     SharedPreferences.Editor editor = getEditor(); 

     if (strPass1.equals(strPass2)) { 

      editor.putString("password", strPass1); 
      editor.commit(); 
     } 

     super.onDialogClosed(positiveResult); 

    } 
} 

Questa classe PreferenceActivity contenente Preferenze personalizzato onPreferenceClick. Questo è dove ho bisogno di chiamare la finestra di dialogo per modificare l'impostazione della password utente.

package biz.linsys.package; 

import android.content.Context; 
import android.os.Bundle; 
import android.preference.Preference; 
import android.preference.Preference.OnPreferenceClickListener; 
import android.preference.PreferenceActivity; 

public class Preferences extends PreferenceActivity { 

    public static Context dialogContext; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.preferences); 

     // Get the custom preference 
     Preference customPref = (Preference) findPreference("customPref"); 

     customPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { 

      public boolean onPreferenceClick(Preference preference) { 

       // [ NEED TO CALL DIALOG FROM HERE ] 

       return false; 
      } 
     }); 
    } 
} 
+0

Quindi, quando si fa clic su una finestra di dialogo con i pulsanti, si attiva un'attività di preferenza? –

+0

@MasterJB: Sì, la finestra di dialogo ha pulsanti. Mi rendo conto che non ho incluso i pulsanti nel file di layout XML. – Lukuluba

+0

Beh, l'ho chiesto perché, in passato, ho semplicemente lanciato una piccola attività da un pulsante che aveva la GUI di Dialogue che era stata installata all'interno del manifest: "android: theme =" @ android: style/Theme.Dialog ". Lo farebbe semplicemente intenzionando l'attività e lo spirito verrà visualizzato in un dialogo. –

risposta

13

Questo è qualcosa che manca nella documentazione, e ho trovato un sacco di domande simili che lo riguardano, per lo più senza risposte certe. Oggi ho affrontato lo stesso problema, e in qualche modo ho trovato la soluzione, quindi riassumerò la mia ricerca qui, nella speranza che qualcuno possa trovare ciò utile. A proposito la tua domanda è la più dettagliata e accurata tra le altre.

Il punto generale è che non è necessario creare manualmente la finestra di dialogo, basta 1) creare una sottoclasse di DialogPreference che gestirà la logica di una preferenza complessa e 2) creare un nodo del tipo corretto in your preferences.xml in modo che la finestra di dialogo venga generata automaticamente.

Il problema di Android SDK è che non è possibile aggiungere il nodo corretto utilizzando l'editor di Visual XML, è necessario andare e modificare il file manualmente.

Il problema della documentazione è che manca un sacco di informazioni.

Così qui è la soluzione step-by-step:

1) Creare una sottoclasse di DialogPreference che gestirà la vostra preferenza speciale. Per i dettagli su ciò che è necessario nella sottoclasse, ti consiglio di specificare this answer.

2) Creare un nodo di preferenza in preferences.xml.

3) Modificare il preferences.xml e sostituire la preferenza con il nome completo della sottoclasse DialogPreference incluso il percorso del pacchetto, e. g. com.sample.MyPreferenceDialog. È inoltre possibile aggiungere alcuni attributi al nodo per personalizzare la finestra di dialogo (titolo, icona, ecc.), Vedere this answer o la documentazione di DialogPreference per i dettagli.

Questo è tutto. Non è necessario aggiungere OnPreferenceClickListener alle preferenze, la finestra di dialogo verrà visualizzata automaticamente.

Nota: non sono sicuro al 100% che questo sia il modo previsto di utilizzare le cose, ma sembra funzionare.

Problemi correlati