您好我很想知道这个对话框中的问题在哪里。我正在尝试在edittext
内创建一个对话框。如果edittext
为空,则必须禁用肯定button
,否则启用。我写了这段代码。
public class Example extends AlertDialog {
AlertDialog.Builder builder;
EditText mEditText;
Context mContext;
Button button;
String text;
protected Example(Context context) {
super(context);
// TODO Auto-generated constructor stub
builder = new AlertDialog.Builder(context);
this.mContext = context;
mEditText = new EditText(mContext);
builder.setView(mEditText);
builder.setPositiveButton("Okay", null);
builder.setNegativeButton("No", null);
mEditText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
AlertDialog dialog = builder.create();
text = mEditText.getText().toString();
if(text.trim().length()>0) {
button = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
if(button != null)
button.setEnabled(true);
else
button = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
button.setEnabled(false);
}
else
button = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
button.setEnabled(false);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
builder.setTitle("Example Dialog");
builder.create();
builder.show();
}
}
当我执行此代码并在edittext
中写一些内容时,我会在{@ 1}处的if内的else处获得NullPointerException
问题在哪里?
答案 0 :(得分:1)
if和else的范围仅限于下一个语句。如果要使用多个语句将其括在块中。例如 -
else
{
button = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
button.setEnabled(false);
}
答案 1 :(得分:1)
@Happy_New_Year是对的。你在其他部分缺少{}。如果你没有放{},那么唯一的下一个语句将被视为else部分。 button.setEnabled(false);
超出了else块。所以这里没有初始化button
对象。
答案 2 :(得分:0)
问题发生在text = mEditText.getText().toString();
当文字为null
null.toString();
时会崩溃。
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s != null)
{
if (s.length() > 0)
{
dialog.getButton(Dialog.BUTTON_POSITIVE).setEnabled(true);
}
else {
dialog.getButton(Dialog.BUTTON_POSITIVE).setEnabled(false);
}
}
}
以下是我在项目中使用的完整代码
AlertDialog.Builder builder; // Declare Globally
AlertDialog dialog; // Declare Globally
builder = new AlertDialog.Builder(this);
builder.setCancelable(false);
builder.setTitle("Add New Keyword");
final EditText input = new EditText(this);
input.setHint("Min 3 Chars");
builder.setView(input);
input.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s != null)
{
if (s.length() > 2)
{
dialog.getButton(Dialog.BUTTON_POSITIVE).setEnabled(true);
}
else {
dialog.getButton(Dialog.BUTTON_POSITIVE).setEnabled(false);
}
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
if (input != null)
{
System.out.println("Entered Text" + input.getText().toString().trim());
}
}
});
builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
dialog.dismiss();
}
});
dialog = builder.create();
dialog.show();
dialog.getButton(Dialog.BUTTON_POSITIVE).setEnabled(false);
}
答案 3 :(得分:-1)
错误显然在这一行: -
mEditText = new EditText(mContext);
通过这样做,您已为Edittext创建了一个新对象。当我们创建动态edittext或任何其他小部件时,我们会这样做。
在正常情况下,您需要传递对您的edittext的引用,您必须在编辑文本的xml文件中的名为“id”的属性中提供该引用,例如: -
<EditText
android:id = "@+id/editText1"
<!-- other properties-->
</EditText
在你的课堂上,首先需要这样做: - mEditText = (EditText)findViewById(R.id.editText1);
我希望你现在能得到它