Android 如何在edittextpreference对话框中设置空验证
如何在edittextpreference对话框中设置空验证,以便在该对话框为空时,用户不能单击“确定”,对话框中应显示一些消息。我已经试了很长时间,但没有成功……我想你要找的是这个。您正在使用预定义的PreferenceDialog(带EditText)并希望检查文本是否为空。据我所知,本例中的“文本”是ChangedReference,因此您可以使用以下内容: 只需使用一个onPreferenceChangedListener即可Android 如何在edittextpreference对话框中设置空验证,android,android-alertdialog,preferenceactivity,edittextpreference,Android,Android Alertdialog,Preferenceactivity,Edittextpreference,如何在edittextpreference对话框中设置空验证,以便在该对话框为空时,用户不能单击“确定”,对话框中应显示一些消息。我已经试了很长时间,但没有成功……我想你要找的是这个。您正在使用预定义的PreferenceDialog(带EditText)并希望检查文本是否为空。据我所知,本例中的“文本”是ChangedReference,因此您可以使用以下内容: 只需使用一个onPreferenceChangedListener即可 yourPreference.setOnPreference
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();
通过这种方式进行验证,如果我们希望在对话框中显示消息,则必须按照Phil的指示创建一个自定义对话框。当edittext为空时,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();
}
}
这就是我要问的…如何做,因为我对此没有任何了解。我不是要你为我写代码,而是告诉我该怎么做。@weblado.at::edittext和edittextpreference是两件不同的事情,如果你知道的话。我知道如何设置edittext的验证…。你甚至没有正确阅读问题就投票否决了我。我想你不要读最后一行…我很长时间以来一直在试图找到它,但没有成功…我已经尝试了您提供的链接。问题是没有调用此setonpreferencechangelistener。好吧,那么我建议您自己实现该对话框。我只需要几分钟就可以实现你想要的一切。是的,除了设置()对话框是内置的。当然。但是当点击PreferenceActivity中的列表元素时,您可以做任何您想做的事情。例如,显示您的自定义对话框并在其中执行您想要的所有操作。我添加了一个如何创建对话框的示例。重点不是创建自定义对话框…而是将此自定义对话框添加到首选项。
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();
}
}