带有setcontentview的Alertdialog

时间:2013-03-12 13:37:09

标签: android button android-alertdialog customdialog

我想创建一个自定义alertdialog。所以我使用了以下代码。

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

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

它表示nullpointer异常。 请帮忙弄清楚这里有什么不对。

提前感谢

3 个答案:

答案 0 :(得分:1)

这是一个自定义的Yes-No对话框。它与您想要实现的类似。您可以轻松地将其调整为您的布局。

在构造函数中夸大自定义布局

按其ID

找到您的Button

Button的{​​{1}}: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();

}

答案 1 :(得分:0)

您肯定正在进行一些过度工程,只需使用setView() View上的自定义AlertDialog's拨打Builder即可。希望这会有所帮助。

答案 2 :(得分: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));