如何在EditTextPreference对话框中设置空值验证

5
如何在EditTextPreference对话框中进行空值验证,以便如果为空,则用户不能点击确定,并且应在对话框中显示一些消息。我一直尝试找到它很长时间了,但没有成功...

这是我在询问的...我不知道该怎么做,因为我找不到任何相关信息。我并不是要求你为我编写代码,而是告诉我该怎么做。 - Rishabh Srivastava
@weblado.at :: EditText和EditTextPreference是两个不同的东西,如果你知道的话。我知道如何在EditText上设置验证......而你甚至没有正确阅读问题就把我投票否决了。 - Rishabh Srivastava
我认为你没有读到最后一行……我已经尝试了很长时间,但是没有成功……我已经尝试了你给的链接。问题是这个 setonpreferencechangelistener 没有被调用。 - Rishabh Srivastava
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/35724/discussion-between-webaldo-at-and-rishabh-srivastava - JavaDM
3个回答

6
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说的那样创建自定义对话框。

2
我想您需要的是这个。您正在使用预定义的PreferenceDialog(带有EditText),并希望检查文本是否为空。据我所知,此处的“text”是已更改的首选项,因此您可以使用以下内容:
只需为此使用一个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
那么我建议您亲自实现对话框。这样做只需要几分钟就可以实现您想要的一切。 - Philipp Jahoda
1
是的,我可以做到,但对于设置(http://developer.android.com/guide/topics/ui/settings.html),对话框是内置的。 - Rishabh Srivastava
当然可以。但是在PreferenceActivity中单击列表元素时,您可以做任何您想做的事情。例如,显示自定义对话框并在其中执行所有您想要的操作。 - Philipp Jahoda
1
我添加了一个如何制作对话框的示例。 - Philipp Jahoda
重点不是创建自定义对话框,而是将此自定义对话框添加到首选项中。 - Rishabh Srivastava

2

当edittext为空时,确定按钮将被禁用,一旦输入文本,按钮将启用:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接