2012-04-04 20 views
10

メニューオプションから起動した作業環境設定があります。設定では、3つのTextViewsを使用してダイアログボックスを起動してパスワードを確認して変更する必要があるカスタム設定をセットアップしています。今、PreferenceActivityのonPreferenceClickからダイアログを起動する方法がわかりません。私がnewbyのように聞こえるなら - 私は、申し訳ありません!ここで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); 

    } 
} 

このカスタムプリファレンスをonPreferenceClick含むPreferenceActivityクラス。ここで、ダイアログボックスを呼び出してユーザーのパスワード設定を変更する必要があります。

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

あなたは好みのアクティビティを持っているので、クリックするとボタン付きのダイアログボックスが開きますか? –

+0

@ MasterJB:はい、ダイアログにボタンがあります。私は、XMLレイアウトファイルにボタンを含めていないことに気付きました。 – Lukuluba

+0

これまで、マニフェストの中からセットアップされたDialogue GUIを持ったボタンから小さなアクティビティを起動したので、 "android:theme =" @アンドロイド:style/Theme.Dialog "という質問をしました。 これは単にアクティビティを意図しているため、ダイアログでポップアップが表示されます。 –

答えて

13

これはマニュアルに欠けている何かである、と私はほとんどいない明確な答えを、それについての同様の質問をたくさん見つけました。私は今日も同じ問題に直面していましたが、何とか解決策を見つけましたので、ここで私のクエストを要約します。あなたの質問は、最も詳細で正確なものです。

一般的な点は、ダイアログを手動で作成する必要はないことです.1)複雑な設定のロジックを処理するDialogPreferenceのサブクラスを作成し、2)適切なタイプのノードを作成します。ダイアログが自動的に生成されるようにします。

Android SDKの問題点は、ビジュアルXMLエディタを使用して適切なノードを追加できないため、手動でファイルを編集する必要があることです。

ドキュメントの問題は、この非常に小さな情報が欠落していることです。

1)あなたの特別な好みを処理するDialogPreferenceのサブクラスを作成しますので、ここで

は、ステップバイステップのソリューションです。あなたのサブクラスで必要なものの詳細については、 this answerをお勧めします。

2)preferences.xmlにプリファレンスノードを作成します。

3)preferences.xmlを編集して、パッケージパスを含むDialogPreferenceサブクラスのフルネームに置き換えます。e。 g。 com.sample.MyPreferenceDialog。ノードにいくつかの属性を追加してダイアログ(タイトル、アイコンなど)をカスタマイズすることもできます。詳しくは、this answerまたはDialogPreferenceのドキュメントを参照してください。

それだけです。 OnPreferenceClickListenerを環境設定に追加する必要はなく、ダイアログが自動的に表示されます。

注:これは意図した方法であることを100%確信しているわけではありませんが、動作しているようです。

関連する問題