【问题标题】:How to set null validation in edittextpreference dialog如何在edittextpreference对话框中设置空验证
【发布时间】:2013-08-19 06:40:40
【问题描述】:

如何在 edittextpreference 对话框中设置 null 验证,如果它为 null,用户应该无法单击确定,并且应该在对话框本身中显示一些消息。找了好久都没成功....

【问题讨论】:

  • 这就是我要问的...怎么做,因为我对此一无所知。我不是要你为我写代码,而是要告诉我该怎么做。
  • @weblado.at :: edittext 和 edittextpreference 是两个不同的东西,如果你知道的话。我知道如何在 edittext 上设置验证.....而你甚至没有阅读任务就投了我的票正确。
  • 我想你没有读到最后一行......我试图找到它已经很久了但没有成功......我已经尝试过你给的链接。问题是没有调用这个setonpreferencechangelistener。

标签: android android-alertdialog preferenceactivity edittextpreference


【解决方案1】:
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 是否为空。据我所知,这种情况下的“文本”是 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();
    

    【讨论】:

    • 那么我建议您自己实现对话框。我应该只需要几分钟就能实现你想要的一切。
    • 是的,我可以这样做,但对于设置(developer.android.com/guide/topics/ui/settings.html),对话框是内置的。
    • 当然。但是,当单击 PreferenceActivity 中的 List 元素时,您可以做任何您想做的事情。例如,显示您的自定义对话框并在其中做所有您想做的事情。
    • 我添加了一个如何制作对话框的示例。
    • 重点不是创建自定义对话框...而是将此自定义对话框添加到首选项中。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2020-07-15
      • 1970-01-01
      • 1970-01-01
      • 2015-08-20
      • 2011-03-25
      • 1970-01-01
      • 2016-05-29
      • 2011-12-17
      • 1970-01-01
      相关资源
      最近更新 更多