2012-04-04 9 views
10

Ich habe eine funktionierende Einstellungen-Setup von einer Menüoption gestartet. In den Einstellungen habe ich eine benutzerdefinierte Einstellung eingerichtet, die einen Dialog mit 3 TextViews zum Bestätigen und Ändern eines Passwortes starten muss. Jetzt weiß ich nicht, wie ich den Dialog von PreferenceActivity onPreferenceClick starten kann. Wenn ich mich wie ein Newby anhöre - tut mir leid!Wie PreferenceActivity einen Dialog zum Festlegen einer benutzerdefinierten Einstellung starten

Hier ist mein xml Layout für den Dialog: 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" /> 

Hier ist meine DialogChangePassword Klasse für den Dialog: 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); 

    } 
} 

Dies ist der PreferenceActivity Klasse enthält kundenspezifische Präferenz onPreferenceClick. Hier muss ich das Dialogfeld aufrufen, um die Benutzerpassworteinstellung zu ändern.

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

So haben Sie Präferenz Aktivität, wenn geklickt startet ein Dialogfeld mit Schaltflächen? –

+0

@MasterJB: Ja, der Dialog hat Schaltflächen. Ich weiß, dass ich die Schaltflächen in der XML-Layout-Datei nicht aufgenommen habe. – Lukuluba

+0

Nun, ich habe das gefragt, weil ich in der Vergangenheit einfach eine kleine Aktivität von einem Button gestartet habe, der die Dialogue-GUI hatte, die im Manifest eingerichtet wurde: "android: theme =" @ android: style/Theme.Dialog ". Sie würden dies tun, indem Sie einfach zu der Aktivität und Witz Popup in einem Dialog. –

Antwort

13

Dies ist etwas, das in der Dokumentation fehlt, und ich habe viele ähnliche Fragen in Bezug auf sie, meist ohne definitive Antworten gefunden. Ich habe heute dasselbe Problem, und irgendwie habe ich die Lösung gefunden, also werde ich meine Suche hier zusammenfassen, nur in der Hoffnung, dass jemand das nützlich finden wird. BTW Ihre Frage ist die detaillierteste und genaueste unter anderen.

Der allgemeine Punkt ist, dass Sie das Dialogfeld nicht manuell erstellen müssen, Sie 1) erstellen Sie eine Unterklasse der DialogPreference, die die Logik einer komplexen Präferenz behandelt und 2) erstellen Sie einen Knoten des richtigen Typs Ihre preferences.xml, damit der Dialog automatisch erzeugt wird.

Das Problem des Android SDK ist, dass Sie den richtigen Knoten nicht mithilfe des visuellen XML-Editors hinzufügen können. Sie müssen die Datei manuell bearbeiten.

Das Problem der Dokumentation ist, dass es genau diese Information vermisst.

So, hier ist der Schritt-für-Schritt-Lösung:

1) eine Unterklasse von DialogPreference erstellen, die Ihre besondere Vorliebe behandelt. Für Details über was in Ihrer Unterklasse benötigt wird, empfehle ich this answer.

2) Erstellen Sie einen Präferenzknoten in Ihrer preferences.xml.

3) Bearbeiten Sie die preferences.xml und ersetzen Sie die Voreinstellung durch den vollständigen Namen Ihrer DialogPreference-Unterklasse einschließlich des Paketpfads, z. G. com.sample.MyPreferenceDialog. Sie können dem Knoten auch einige Attribute hinzufügen, um den Dialog anzupassen (Titel, Symbol usw.), siehe this answer oder die Dokumentation zu DialogPreference für Details.

Das ist alles. Sie müssen OnPreferenceClickListener nicht zu den Voreinstellungen hinzufügen, der Dialog wird automatisch angezeigt.

Hinweis: Ich bin nicht 100% sicher, dass dies die beabsichtigte Art der Verwendung von Dingen ist, aber es scheint zu funktionieren.

Verwandte Themen