我想创建一个自定义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异常。 请帮忙弄清楚这里有什么不对。
提前感谢
答案 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));