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?
Odpowiedz
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();
}
}
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();
Cóż, więc polecam Ci zaimplementować dialog siebie. Powinienem zająć tylko kilka minut, aby osiągnąć wszystko, co chcesz. –
ya, że mogę zrobić, ale dla ustawień (http://developer.android.com/guide/topics/ui/settings.html) okna dialogowe są wbudowane. –
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. –
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.
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ć. –
@ 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. –
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 . –