5

如何在edittextpreference對話框中設置空驗證,以便如果它爲null,則用戶不應該能夠單擊確定,並且應該在對話框中顯示一些消息。我一直試圖找到它很長一段時間,但沒有成功....如何在edittextpreference對話框中設置空驗證

+0

那是什麼要問...如何做到這一點,因爲我沒有得到任何關於這個的。不要求你爲我寫一段代碼,而是要告訴做什麼。 –

+0

@ weblado.at :: edittext和edittextpreference是兩個不同的東西,如果你知道的話。我知道如何在edittext上設置驗證.....你只是投了我一票,甚至沒有正確閱讀任務。 –

+0

我想你不會讀最後一行....我試圖找到它,因爲很長一段時間,但沒有成功....我已經嘗試了你給的鏈接。問題是這個setonpreferencechangelistener不叫。 –

回答

2

當的EditText爲null,則確定按鈕將被禁用,只要輸入文本都將重新啓動::

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

我認爲你在找什麼是這個。您正在使用預定義的PreferenceDialog(帶有EditText)並且想要檢查文本是否爲空。據我所知,在這種情況下,「文本」是changedPreference,因此你可以這樣做:

只需使用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; 
       } 
     } 
    }); 

對於更高級的需求,我建議你實現自己的對話框和裏面,做任何你想要的。您可以通過在.xml中定義首選項列表條目來實現這一點,然後在點擊它時產生對話框。

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

     public boolean onPreferenceClick(Preference preference) { 

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

這是你如何可以實現自定義的EditText對話框:

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

然後調用它像這樣:

buildDialog(yourcontext).show(); 
+1

那麼我會建議你實現對話框你自己。我應該只花幾分鐘來實現你想要的一切。 –

+1

亞,我可以做但設置(http://developer.android.com/guide/topics/ui/settings.html)對話框內置。 –

+0

當然。但是當點擊PreferenceActivity中的List元素時,你可以做任何你想做的事情。例如,顯示你的自定義對話框,並在那裏做所有你想要的事情。 –

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

通過這種方式,驗證完成後,如果我們希望在對話框中顯示消息,然後必須按照Phil已經告訴的那樣創建一個自定義對話框。