1

我想创建一个自定义警报对话框。所以我使用了以下代码。

public class MyAlertDialog extends AlertDialog {

    protected MyAlertDialog(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void show() {
        // TODO Auto-generated method stub
        super.show();
        setContentView(R.layout.logindialog);
    }
}

登录对话框.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/layoutgrey" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:textSize="@dimen/mediuem"
        android:text="username" />

    <EditText
        android:id="@+id/editText1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/textView1"
        android:textSize="@dimen/mediuem"
        android:inputType="textPersonName" >

        <requestFocus />
    </EditText>

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/editText1"
        android:layout_marginTop="12dp"
        android:textSize="@dimen/mediuem"
        android:text= Password" />

    <EditText
        android:id="@+id/editText2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/textView2"
        android:textSize="@dimen/mediuem"
        android:inputType="textPersonName" />

    <Button
        android:id="@+id/button2"
        android:background="@drawable/buttons"
        android:layout_width="100dp"
        android:layout_height="40dp"
        android:layout_alignBaseline="@+id/button1"
        android:layout_alignBottom="@+id/button1"
        android:layout_alignParentRight="true"
        android:layout_marginRight="20dp"
        android:text="Cancel" />

    <Button
        android:id="@+id/button1"
        android:background="@drawable/buttons"
        android:layout_width="100dp"
        android:layout_height="40dp"
        android:layout_below="@+id/editText2"
        android:layout_marginLeft="20dp"
        android:layout_marginTop="28dp"
        android:layout_alignParentLeft="true"
        android:text="Ok" />

</RelativeLayout>

所以当我尝试像这样使用自定义创建的按钮时

final MyAlertDialog alert = new MyAlertDialog(Home.this);
alert.show();
Button ok=(Button)alert.findViewById(R.id.button1);
Button cancel=(Button)alert.findViewById(R.id.button2);

ok.setOnClickListener(new OnClickListener()
{

    @Override
    public void onClick(View v) 
    {
        // TODO Auto-generated method stub
    }
});

它说空指针异常。请帮助找出这里出了什么问题。

预先感谢

4

3 回答 3

1

这是一个自定义 Yes-No 对话框。这与您要实现的目标相似。您可以轻松地使其适应您的布局。

在构造函数中膨胀您的自定义布局

Button通过 ID查找您的

设置Button's OnClickListener: 内部onClick()调用您稍后需要实现的抽象方法。

public abstract class YesNoDialog extends Dialog 
{
    private String mMessage = "";
    private TextView mText;
    private Button mYes;
    private Button mNo;

    public YesNoDialog(Context context, String message)
    {
        super(context);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        View v = getLayoutInflater().inflate(R.layout.yes_no_dialog, null);
        mText = (TextView) v.findViewById(R.id.message);
        mMessage = message;
        mText.setText(mMessage);
        mYes = (Button) v.findViewById(R.id.yes);
        mYes.setOnClickListener(new View.OnClickListener()
        {

            @Override
            public void onClick(View v)
            {
                dismiss();
                onYes();
            }
        });
        mNo = (Button) v.findViewById(R.id.no);
        mNo.setOnClickListener(new View.OnClickListener()
        {

            @Override
            public void onClick(View v)
            {
                dismiss();
                onNo();
            }
        });
        setCancelable(false);
        setCanceledOnTouchOutside(false);
        setContentView(v);
    }

    public abstract void onYes();

    public abstract void onNo();

}


这是如何使用它:

YesNoDialog dialog = new YesNoDialog(this, "message")
{

    @Override
    public void onYes()
    {
      // do something           
    }

    @Override
    public void onNo()
    {
      // do something
    }
};
dialog.show();
于 2013-03-12T14:09:33.747 回答
0
 your getting null pointer exception because your directly trying to access the layout.
 tryout some like this

// in case your in activity class
setContentView(getLayoutInflater().inflate(R.layout.logindialog,null));

// in case of other than activity pass the context and use it like this 

  setContentView(((LayoutInflator)context.getSystemService(     Context.LAYOUT_INFLATER_SERVICE))getLayoutInflater().inflate(R.layout.logindialog,null));
于 2013-03-29T09:34:01.210 回答
0

您肯定在做一些过度设计,setView()只需ViewAlertDialog's Builder. 希望这可以帮助。

于 2013-03-12T13:39:27.833 回答