2012-04-04 38 views
10

我从菜单选项启动了工作首选项设置。在首选项中,我设置了一个自定义首选项,它必须启动一个包含3个TextViews的对话框来设置确认并更改密码。现在我不知道如何从PreferenceActivity的onPreferenceClick启动对话框。如果我听起来像一个新人 - 我很抱歉!如何使PreferenceActivity启动对话框以设置自定义首选项

这里是我的对话框弹出XML布局:

<?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" /> 

这里是我的对话框弹出DialogChangePassword类:

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

    } 
} 

这含有PreferenceActivity类自定义偏好onPreferenceClick。这是我需要调用对话框来更改用户密码设置的位置。

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

因此,您有偏好活动,点击后会启动一个带按钮的对话框? – 2012-04-05 00:58:23

+0

@MasterJB:是的,对话框有按钮。我意识到我没有在XML布局文件中包含这些按钮。 – Lukuluba 2012-04-05 05:25:18

+0

嗯,我问过,因为在过去,我只是从一个按钮中启动了一个小的活动,该按钮具有从清单内安装的对话GUI:“android:theme =”@ android:style/Theme.Dialog“。 你可以通过简单的意向来做到这一点,机智将在对话中弹出。 – 2012-04-05 06:19:40

回答

13

这是什么,在文档中缺少的,我发现很多类似的问题有关的,大多没有明确的答案。我今天遇到了同样的问题,不知何故我找到了解决方案,所以我会在这里总结我的任务,希望有人会发现这个有用。顺便提一下,你的问题是其中最详细和准确的。

一般的观点是,你不需要手动创建对话框,你只需要1)创建DialogPreference的子类,它将处理复杂首选项的逻辑,2)创建一个适当类型的节点你的preferences.xml,所以对话框会自动产生。

了Android SDK的问题是,你不能使用可视化的XML编辑器添加适当的节点,你需要去和手动编辑文件。

文档的问题是,它错过这个非常比特的信息。

因此,这里是一步一步的解决方案:

1)创建DialogPreference的子类,将处理您的特殊偏好。有关您的子类中需要什么的详细信息,我建议使用this answer

2)在你的preferences.xml中创建一个首选项节点。

3)编辑中的preferences.xml,并与您DialogPreference子类,包括包路径,电子的全名替换偏好。 G。 com.sample.MyPreferenceDialog。您还可以向节点添加一些属性以自定义对话框(标题,图标等),有关详细信息,请参见this answer或DialogPreference的文档。

就是这样。您不需要将OnPreferenceClickListener添加到首选项,对话框将自动显示。

注:我不是100%肯定这是使用的东西的预期方式,但它似乎是工作。

相关问题