5

Jak ustawić zerową walidację w oknie dialogowym edittextpreference, tak aby w przypadku wartości pustej użytkownik nie mógł kliknąć OK, a część komunikatu powinna zostać wyświetlona w samym oknie dialogowym. Próbowałem go znaleźć przez długi czas, ale bez powodzenia ...Jak ustawić weryfikację zerową w oknie dialogowym edittextpreference?

+0

to co pytam ... jak to zrobić jak nie jestem coraz Cokolwiek na ten temat. Nie proszę o napisanie kodu, ale o to, co mam robić. –

+0

@ weblado.at :: edittext i edittextpreference to dwie różne rzeczy, jeśli wiesz. Wiem, jak ustawić weryfikację na edittext ..... i właśnie przegłosowałeś mnie, nawet nie czytając poprawnie questonu. –

+0

Myślę, że nie czytasz ostatniej linii ... próbuję znaleźć to od dawna, ale bez sukcesu .... już próbowałem podanego linku. Problem polega na tym, że ten setonpreferencechangelistener nie jest nazywany . –

Odpowiedz

2

Kiedy EditText jest null następnie przycisk OK zostaną wyłączone i jak tylko tekst wpisany zostanie on włączony ::

public class CustomEditTextPreference extends EditTextPreference implements 
     OnClickListener { 


     public CustomEditTextPreference(Context ctx, AttributeSet attrs, int defStyle) 
     { 
      super(ctx, attrs, defStyle);   
     } 

     public CustomEditTextPreference(Context ctx, AttributeSet attrs) 
     { 
      super(ctx, attrs);     
     } 

     private class EditTextWatcher implements TextWatcher 
     {  
      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count){} 

      @Override 
      public void beforeTextChanged(CharSequence s, int start, int before, int count){} 

      @Override 
      public void afterTextChanged(Editable s) 
      {   
       onEditTextChanged(); 
      } 
     } 
     EditTextWatcher m_watcher = new EditTextWatcher(); 

     /** 
     * Return true in order to enable positive button or false to disable it. 
     */ 
     protected boolean onCheckValue(String value) 
     {   
      if (value.trim().equals("")) 
      { 
       return false; 
      } 
      return true; 
     } 

     protected void onEditTextChanged() 
     { 
      boolean enable = onCheckValue(getEditText().getText().toString()); 
      Dialog dlg = getDialog(); 
      if(dlg instanceof AlertDialog) 
      { 
       AlertDialog alertDlg = (AlertDialog)dlg; 
       Button btn = alertDlg.getButton(AlertDialog.BUTTON_POSITIVE); 
       btn.setEnabled(enable);     
      } 
     } 

     @Override 
     protected void showDialog(Bundle state) 
     { 
      super.showDialog(state); 

      getEditText().removeTextChangedListener(m_watcher); 
      getEditText().addTextChangedListener(m_watcher); 
      onEditTextChanged(); 
     }  
    } 
2

Myślę, że to, czego szukasz, to jest to. Używasz predefiniowanego PreferenceDialog (z EditText) i chcesz sprawdzić, czy tekst jest pusty. Zgodnie z moją wiedzą, "tekst" w tym przypadku jest zmienionyPreferencja, więc możesz iść z tym:

Po prostu użyj do tego onPreferenceChangedListener.

yourPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 
     @Override 
     public boolean onPreferenceChange(Preference preference, Object changedValue) { 

       if(changedValue == null) { 
        // handle it being null 

        return false; 
       } else { 

        return true; 
       } 
     } 
    }); 

Dla bardziej zaawansowanych wymagań, polecam że zaimplementować własną Dialog i wewnątrz niego, zrobić cokolwiek chcesz. Możesz to zrobić, definiując wpis listy preferencji w .xml, a następnie odradzając okno dialogowe po kliknięciu w niego.

Preference yourCustomPref = (Preference) findPreference("yourPref"); 
yourCustomPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { 

     public boolean onPreferenceClick(Preference preference) { 

      // spawn your dialog here 
      return true; 
     } 
    }); 

W ten sposób można realizować niestandardowe EditText Dialog:

public Builder buildDialog(final Context c) { 

     AlertDialog.Builder builder = new AlertDialog.Builder(c); 
     builder.setTitle("EditText Dialog"); 
     builder.setMessage("Enter text:"); 

     LinearLayout llV = new LinearLayout(c); 
     llV.setOrientation(1); // 1 = vertical 

     final EditText patName = new EditText(c); 
     patName.setHint("Enter text..."); 

     LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT, 1f); 
     lp.bottomMargin = 20; 
     lp.rightMargin = 30; 
     lp.leftMargin = 15; 

     patName.setLayoutParams(lp); 

     llV.addView(patName); 

     builder.setView(llV); 

     builder.setPositiveButton("Save", new DialogInterface.OnClickListener() { 

      @Override 
      public void onClick(DialogInterface dialog, int which) { 

       if(patName.getText().toString().length() > 0) { 

       } else { 

       }  
      } 
     }); 

     builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 

      @Override 
      public void onClick(DialogInterface dialog, int which) { 

       dialog.dismiss(); 
      } 
     }); 

     return builder; 
    } 

A potem nazwać tak:

buildDialog(yourcontext).show(); 
+1

Cóż, więc polecam Ci zaimplementować dialog siebie. Powinienem zająć tylko kilka minut, aby osiągnąć wszystko, co chcesz. –

+1

ya, że ​​mogę zrobić, ale dla ustawień (http://developer.android.com/guide/topics/ui/settings.html) okna dialogowe są wbudowane. –

+0

Oczywiście. Ale po kliknięciu na element listy wewnątrz PreferenceActivity możesz robić, co chcesz. Na przykład pokaż niestandardowe okno dialogowe i wykonaj wszystkie potrzebne czynności. –

5
edttxtpref = (EditTextPreference) getPreferenceScreen().findPreference(
      "edttxtkey"); 
    edttxtpref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 
     @Override 
     public boolean onPreferenceChange(
       android.preference.Preference preference, Object newValue) { 
      if (newValue.toString().trim().equals("")) { 

       Toast.makeText(getActivity(), "Username can not be empty", 
         Toast.LENGTH_LONG).show(); 

       return false; 
      } 
      return true; 
     } 
    }); 

ten sposób sprawdzania poprawności jest wykonywane, a jeśli chcemy wyświetlić komunikat w samym oknie dialogowym, a następnie utworzyć niestandardowe okno dialogowe, tak jak zostało to już powiedziane przez Phila.

Powiązane problemy