5

So legen Sie die Nullüberprüfung im Editiertext-Dialog fest, damit der Benutzer nicht auf OK klicken und einige Meldungen im Dialogfeld selbst angezeigt werden. Ich habe versucht, es für eine lange Zeit zu finden, aber kein Erfolg ....So legen Sie die Nullüberprüfung im Dialogfeld zur Bearbeitung von Textvorgaben fest

+0

das ist, was ich frage ... wie es zu tun, wie ich nicht bin immer irgendwas dazu. Ich bitte dich nicht, einen Code für mich zu schreiben, sondern zu sagen, was zu tun ist. –

+0

@ weblado.at :: edittext und edittextpreference sind zwei verschiedene Dinge, wenn du weißt.Ich weiß, wie man eine Bestätigung auf editiertext setzt ..... und du hast mich einfach abgelehnt, ohne auch nur die Quest richtig gelesen zu haben. –

+0

Ich denke, du liest nicht die letzte Zeile .... Ich versuche es seit langer Zeit zu finden, aber keinen Erfolg .... Ich habe bereits versucht, den Link, den Sie gaben. Das Problem ist, dass dieser Setonreferencechangelistener nicht aufgerufen wird . –

Antwort

2

Wenn EditText ist null, dann wird OK-Taste deaktiviert werden, und sobald der Text eingegeben wird, wird es aktiviert sein ::

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

Ich denke, was Sie suchen, ist dies. Sie verwenden den vordefinierten PreferenceDialog (mit EditText) und möchten prüfen, ob der Text Null ist. Nach meinem Wissen ist der "Text" in diesem Fall die ChangedPreference, daher können Sie damit gehen:

Verwenden Sie einfach einen onPreferenceChangedListener dafür.

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

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

        return false; 
       } else { 

        return true; 
       } 
     } 
    }); 

Für anspruchsvollere Anforderungen, würde ich empfehlen, dass Sie Ihren eigenen Dialog und im Inneren implementieren , tun, was Sie sich wünschen. Sie können dies erreichen, indem Sie einen Preference-Listeneintrag in .xml definieren und den Dialog dann beim Klicken darauf erzeugen.

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

     public boolean onPreferenceClick(Preference preference) { 

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

Dies ist, wie Sie Ihre benutzerdefinierten EditText Dialog implementieren könnte:

es
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; 
    } 

Und dann rufen Sie wie folgt aus:

buildDialog(yourcontext).show(); 
+1

Nun, ich würde empfehlen, dass Sie den Dialog implementieren dich selber. Ich brauche nur ein paar Minuten, um alles zu erreichen, was du willst. –

+1

ya das kann ich aber für Einstellungen (http://developer.android.com/guide/topics/ui/settings.html) die Dialoge sind eingebaut. –

+0

Natürlich. Wenn Sie jedoch auf ein List-Element in einer PreferenceActivity klicken, können Sie tun, was Sie wollen. Zeigen Sie zum Beispiel Ihren benutzerdefinierten Dialog und machen Sie alle gewünschten Dinge dort. –

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

diese Weise wird die Validierung durchgeführt wird, und wenn wir wollen die Nachricht im Dialog selbst anzeigen, dann muss ein benutzerdefinierter Dialog erstellt werden, wie bereits von Phil erzählt.

Verwandte Themen