Как установить нулевую проверку в диалоговом окне edittextpreference

Как установить нулевую валидацию в диалоговом окне edittextpreference, чтобы, если она равна нулю, пользователь не должен иметь возможность щелкнуть ok, и некоторое сообщение должно отображаться в самом диалоге. Я пытался найти его надолго, но не успел …

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

Таким образом, проверка выполняется, и если мы хотим отобразить сообщение в самом диалоге, тогда необходимо создать пользовательский диалог, как уже сказал Фил.

Я думаю, что вы ищете это. Вы используете предопределенный PreferenceDialog (с EditText) и хотите проверить, является ли текст нулевым. По моим сведениям, «текст» в этом случае является измененным, поэтому вы можете пойти с этим:

Для этого просто используйте 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(); 

Когда edittext имеет значение null, кнопка ok будет отключена, и как только текст будет введен, он будет включен ::

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