Gutes Beispiel für eine Customice DialogPreference gesucht ..

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Gutes Beispiel für eine Customice DialogPreference gesucht ..

    Hallo Zusammen,

    ich suche derzeit gutes Beispiel, um mir die Systematik für die Erstellung einer eigenen Preference.

    In meiner jetzigen Lösung wird die Vorschau in den Settings nicht dargestellt und ich weiss nicht, wo mein
    Fehler ist.

    Ich habe bis jetzt eine SettingsFragment, welche die Standard-Preference Werte korrekt anzeigt.

    Kurzer Ausschnitt

    Quellcode

    1. public class SettingsFragment extends PreferenceFragmentCompat implements Preference.OnPreferenceChangeListener {
    2. private EditTextPreference KeyAccountName;
    3. private PasswordPreference KeyPassword;
    4. private EditTextPreference KeyPlatName;
    5. private EditTextPreference KeyDriverName;




    Für die Klasse "PasswordPreference" habe ich folgende Klasse:

    Quellcode

    1. public class PasswordPreference extends DialogPreference {
    2. private String sPassword="";
    3. private EditText Password =null;
    4. private int mDialogLayoutResId = R.layout.password_pref_layout;
    5. public PasswordPreference(Context context){
    6. this(context, null);
    7. }
    8. public PasswordPreference(Context context, AttributeSet attrs) {
    9. this(context, null,0);
    10. }
    11. public PasswordPreference(Context context, AttributeSet attrs,
    12. int defStyleAttr) {
    13. this(context, attrs, defStyleAttr, defStyleAttr);
    14. }
    15. public PasswordPreference(Context context, AttributeSet attrs,
    16. int defStyleAttr, int defStyleRes) {
    17. super(context, attrs, defStyleAttr, defStyleRes);
    18. // setWidgetLayoutResource(mDialogLayoutResId);
    19. setDialogLayoutResource(mDialogLayoutResId);
    20. setPositiveButtonText(android.R.string.ok);
    21. setNegativeButtonText(android.R.string.cancel);
    22. }
    23. /*
    24. * Gets the text from the {@link SharedPreferences}.
    25. *
    26. * @return The current preference value.
    27. */
    28. public String getText() {
    29. return sPassword;
    30. }
    31. public String getPassword(){
    32. return sPassword;
    33. }
    34. public void setPassword(String sPass){
    35. sPassword=sPass;
    36. persistString(sPassword);
    37. }
    38. @Override
    39. public CharSequence getSummary() {
    40. return super.getSummary();
    41. }
    42. @Override
    43. public void setSummary(CharSequence sSum){
    44. }
    45. @Override
    46. protected Object onGetDefaultValue(TypedArray a, int index) {
    47. // Default value from attribute. Fallback value is set to 0.
    48. return a.getString(index);
    49. }
    50. @Override
    51. public int getDialogLayoutResource() {
    52. return mDialogLayoutResId;
    53. }
    54. }
    Alles anzeigen

    Ebenso ein Klasse "PasswordPreferenceDialogFragmentCompat"

    Quellcode

    1. public class PasswordPreferenceDialogFragmentCompat extends PreferenceDialogFragmentCompat {
    2. EditText Password;
    3. EditText ConfirmPassword;
    4. EncryptedData encData = null;
    5. private static final int SALT_BYTES = 8;
    6. private static final int PBK_ITERATIONS = 1000;
    7. private static final String ENCRYPTION_ALGORITHM = "AES/CBC/PKCS5Padding";
    8. private static final String PBE_ALGORITHM = "PBEwithSHA256and128BITAES-CBC-BC";
    9. private static final String USED_PASSWORD ="ParkPlatzHilfe!1234";
    10. @Override
    11. public void onDialogClosed(boolean positiveResult) {
    12. String sPassword;
    13. if(positiveResult) {
    14. sPassword = Password.getText().toString();
    15. // Get the related Preference and save the value
    16. DialogPreference preference = getPreference();
    17. if (preference instanceof PasswordPreference) {
    18. PasswordPreference passwordPreference =
    19. ((PasswordPreference) preference);
    20. // This allows the client to ignore the user value.
    21. if (passwordPreference.callChangeListener(
    22. sPassword)) {
    23. // Save the value
    24. passwordPreference.setPassword(sPassword);
    25. }
    26. }
    27. }
    28. }
    29. public static PasswordPreferenceDialogFragmentCompat newInstance(
    30. String key) {
    31. final PasswordPreferenceDialogFragmentCompat
    32. fragment = new PasswordPreferenceDialogFragmentCompat();
    33. final Bundle b = new Bundle(1);
    34. b.putString(ARG_KEY, key);
    35. fragment.setArguments(b);
    36. return fragment;
    37. }
    38. @Override
    39. protected void onBindDialogView(View view) {
    40. super.onBindDialogView(view);
    41. Password= view.findViewById(R.id.editPassword);
    42. // Get the password from the related Preference
    43. String sPass = null;
    44. DialogPreference preference = getPreference();
    45. if (preference instanceof PasswordPreference) {
    46. sPass=((PasswordPreference) preference).getPassword();
    47. }
    48. if(sPass != null){
    49. Password.setText(sPass);
    50. }
    51. }
    52. /*
    53. String password = "ParkPlatzHilfe!1234";
    54. byte[] data = sPassword.getBytes("UTF-8");
    55. EncryptedData encData = encrypt(password, data);
    56. byte[] decryptedData = decrypt(password, encData.salt, encData.iv, encData.encryptedData);
    57. String decDataAsString = new String(decryptedData, "UTF-8");
    58. */
    59. private static class EncryptedData {
    60. public byte[] salt;
    61. public byte[] iv;
    62. public byte[] encryptedData;
    63. }
    64. private EncryptedData encrypt(String password, byte[] data) throws NoSuchPaddingException,
    65. NoSuchAlgorithmException,
    66. InvalidKeySpecException,
    67. InvalidKeyException,
    68. BadPaddingException,
    69. IllegalBlockSizeException,
    70. InvalidAlgorithmParameterException {
    71. EncryptedData encData = new EncryptedData();
    72. SecureRandom rnd = new SecureRandom();
    73. encData.salt = new byte[SALT_BYTES];
    74. encData.iv = new byte[16]; // AES block size
    75. rnd.nextBytes(encData.salt);
    76. rnd.nextBytes(encData.iv);
    77. PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray(), encData.salt, PBK_ITERATIONS);
    78. SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(PBE_ALGORITHM);
    79. Key key = secretKeyFactory.generateSecret(keySpec);
    80. Cipher cipher = Cipher.getInstance(ENCRYPTION_ALGORITHM);
    81. IvParameterSpec ivSpec = new IvParameterSpec(encData.iv);
    82. cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
    83. encData.encryptedData = cipher.doFinal(data);
    84. return encData;
    85. }
    86. private byte[] decrypt(String password, byte[] salt, byte[] iv, byte[] encryptedData) throws NoSuchAlgorithmException,
    87. InvalidKeySpecException,
    88. NoSuchPaddingException,
    89. InvalidKeyException,
    90. BadPaddingException,
    91. IllegalBlockSizeException,
    92. InvalidAlgorithmParameterException {
    93. PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray(), salt, PBK_ITERATIONS);
    94. SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(PBE_ALGORITHM);
    95. Key key = secretKeyFactory.generateSecret(keySpec);
    96. Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    97. IvParameterSpec ivSpec = new IvParameterSpec(iv);
    98. cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);
    99. return cipher.doFinal(encryptedData);
    100. }
    101. //return the password in asterisks
    102. private String setAsterisks(int length) {
    103. StringBuilder sb = new StringBuilder();
    104. for (int s = 0; s < length; s++) {
    105. sb.append("*");
    106. }
    107. return sb.toString();
    108. }
    109. }
    Alles anzeigen


    Hier der Ausschnitt aus der Preference.xml

    Quellcode

    1. <com.example.android.parkhilfeclient.PasswordPreference
    2. android:key="@string/key_Password"
    3. android:dialogMessage="@string/prefs_summary_category_Password"
    4. app:defaultValue="@string/pref_Password"
    5. app:key="@string/key_Password"
    6. app:summary="@string/pref_Password"
    7. app:title="@string/prefs_summary_category_Password"/>

    Das Ergebis ist jedenfalls, das in den Settings ein leerer Eintrag angezeigt wird und ich trotz setzen von Breakpoint nicht gefunden habe wo es klemmt.

    Viele Grüße
    R.