2013-03-12 103 views
1

我想創建一個自定義alertdialog.So我用下面的代碼。Alertdialog與setcontentview

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

它說,空指針異常。 請幫忙弄清楚這裏有什麼問題。

預先感謝

回答

0

你肯定做了一些過度設計,只是在AlertDialog'sBuilder調用setView()與您的自定義View。希望這可以幫助。

1

這是一個自定義的是 - 否對話框。這與你試圖達到的目標相似。你可以很容易地適應你的佈局。

虛增您的自定義佈局在構造

找到你Button通過其ID

設置ButtonOnClickListener:內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(); 
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));