Comment faire un PreferenceActivity lancer une boîte de Dialogue personnaliser la préférence
J'ai une Préférences de travail de l'installation lancée à partir d'une option de menu. Dans les préférences, j'ai le programme d'installation Personnalisé Préférence qui doit lancer un dialogue avec les 3 TextViews pour définir confirmer et modifier un mot de passe. Maintenant, je ne sais pas comment lancer la boîte de dialogue à partir de la PreferenceActivity de onPreferenceClick. Si je ressemble à un newby - je suis désolé!
Voici mon xml mise en page de la boîte de dialogue 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" />
Voici mon DialogChangePassword classe de la boîte de dialogue 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);
}
}
Ce la PreferenceActivity classe contenant des Préférences Personnalisées onPreferenceClick. C'est là que j'ai besoin d'appeler la boîte de dialogue pour modifier le réglage mot de passe utilisateur.
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;
}
});
}
}
Oui, la boîte de dialogue comporte des boutons. Je me rends compte que je ne comprend pas les boutons dans le fichier XML du fichier de Mise en page.
Eh bien j'ai demandé ça parce que, dans le passé, j'ai simplement lancé une petite activité à partir d'un bouton qui avaient du Dialogue de l'interface utilisateur graphique a été le programme d'installation à partir de dans le manifeste:"android:thème="@android:style/Thème.Dialogue". Vous voulez faire cela simplement en essaie de l'activité et de l'esprit pop-up dans un Dialogue.
OriginalL'auteur Lukuluba | 2012-04-04
Vous devez vous connecter pour publier un commentaire.
C'est quelque chose qui manque dans la documentation, et j'ai trouvé beaucoup de questions similaires à propos de ça, surtout avec pas de réponses définitives. J'ai été confronté au même problème aujourd'hui, et en quelque sorte j'ai trouvé la solution, donc je vais résumer ma quête ici, juste dans l'espoir que quelqu'un va trouver cela utile. BTW votre question est la plus détaillée et précise, entre autres.
Le grand point est que vous n'avez pas besoin de créer le dialogue manuellement, vous venez d'1) créer une sous-classe de la DialogPreference qui gère la logique d'un complexe de préférence et 2) créer un nœud de type approprié dans votre preferences.xml si la boîte de dialogue va être généré automatiquement.
Le problème de l'Android SDK est que vous ne pouvez ajouter qu'un bon nœud à l'aide de visual XML editor, vous avez besoin d'aller modifier manuellement le fichier.
Le problème de la documentation est qu'il manque très peu d'informations.
Voici donc l'étape-par-étape de la solution:
1) Créer une sous-classe de DialogPreference qui va gérer votre préférence particulière. Pour plus de détails sur ce qui est nécessaire dans votre sous-classe, je le recommande cette réponse.
2) Créer une Préférence nœud dans votre preferences.xml.
3) Modifier les preferences.xml et remplacez-le de Préférence avec le nom complet de votre DialogPreference sous-classe, y compris le chemin d'accès au package, e. g. com.de l'échantillon.MyPreferenceDialog. Vous pouvez également ajouter des attributs du nœud de personnaliser la boîte de dialogue (titre, icône, etc.), voir cette réponse ou de la documentation pour DialogPreference pour plus de détails.
C'est tout. Vous n'avez pas besoin d'ajouter OnPreferenceClickListener les préférences, la boîte de dialogue s'affichera automatiquement.
Note: je ne suis pas sûr à 100% que c'est la manière prévue de l'utilisation de choses, mais il semble fonctionner.
OriginalL'auteur