Android自定義Dialog - And.He - 博客園 http://www.cnblogs.com/and_he/archive/2011/09/16/2178716.html
這段時(shí)間在做一個(gè)項(xiàng)目,需要使用到自定義Dialog,先在網(wǎng)上找了一下資料,發(fā)現(xiàn)還是有很多沒(méi)有講清楚的,在此給出一個(gè)Demo,一來(lái)可以方便廣大碼農(nóng),二來(lái)也可以方便自己,以備不時(shí)之需。。。
先來(lái)一張圖吧,很簡(jiǎn)單,只有一個(gè)Activity,當(dāng)點(diǎn)擊Button的時(shí)候就彈出這個(gè)自定義的Dialog
里面的幾張圖都比較丑,我不多會(huì)美工,隨便用powerpoint畫了幾張圖,原理是一樣的,先不計(jì)較這些。下面正入正題
為了照顧到所有的碼農(nóng),在些把所有的代碼都貼出來(lái)
新建工程在此就不貼出來(lái)了,只是為了方便大家的復(fù)制粘貼,取包名為com.and.mydialog,主Activity取名為MyDialogActivity
package
com.and.mydialog;
import
android.app.Activity;
import
android.app.AlertDialog;
import
android.app.Dialog;
import
android.content.DialogInterface;
import
android.os.Bundle;
import
android.view.KeyEvent;
import
android.view.LayoutInflater;
import
android.view.Menu;
import
android.view.MenuItem;
import
android.view.View;
import
android.view.View.OnClickListener;
import
android.widget.Button;
import
android.widget.Toast;
public
class
MyDialogActivity
extends
Activity {
/**
Called when the activity is first created.
*/
@Override
public
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button
=
(Button) findViewById(R.id.button1);
button.setOnClickListener(
new
OnClickListener() {
@Override
public
void
onClick(View v) {
//
初始化一個(gè)自定義的Dialog
Dialog dialog = new MyDialog(MyDialogActivity.this
,
R.style.MyDialog);
dialog.show();
}
});
}
}
主布局文件main.xml
<?
xml version="1.0" encoding="utf-8"
?>
<
LinearLayout
xmlns:android
="http://schemas.android.com/apk/res/android"
android:orientation
="vertical"
android:layout_width
="fill_parent"
android:layout_height
="fill_parent"
>
<
Button
android:text
="顯示自定義Dialog"
android:id
="@+id/button1"
android:layout_height
="wrap_content"
android:layout_width
="fill_parent"
/>
</
LinearLayout
>
新建一個(gè)自定義的Dialog類,取名MyDialog,繼承自Dialog
package
com.and.mydialog;
import
android.app.Dialog;
import
android.content.Context;
import
android.os.Bundle;
import
android.view.LayoutInflater;
import
android.view.View;
public
class
MyDialog
extends
Dialog
{
Context context;
public
MyDialog(Context context) {
super
(context);
//
TODO Auto-generated constructor stub
this
.context
=
context;
}
public MyDialog(Context context, int theme){ super(context, theme); this.context =
context;
}
@Override
protected
void
onCreate(Bundle savedInstanceState) {
//
TODO Auto-generated method stub
super
.onCreate(savedInstanceState);
this
.setContentView(R.layout.dialog);
}
}
相應(yīng)的布局文件dialog.xml
<?
xml version="1.0" encoding="utf-8"
?>
<
LinearLayout
xmlns:android
="http://schemas.android.com/apk/res/android"
android:orientation
="vertical"
android:layout_width
="wrap_content"
android:layout_height
="wrap_content"
android:gravity
="center_vertical|center_horizontal"
android:background
="@drawable/dialog_bg"
>
<
RelativeLayout
android:layout_width
="fill_parent"
android:layout_height
="wrap_content"
android:paddingLeft
="30dip"
android:paddingTop
="10dip"
>
<
ImageView
android:id
="@+id/dialog_title_image"
android:layout_alignParentLeft
="true"
android:layout_width
="wrap_content"
android:layout_height
="wrap_content"
android:background
="@drawable/dialog_title_image"
/>
<
TextView
android:layout_width
="wrap_content"
android:layout_height
="wrap_content"
android:layout_marginLeft
="10dip"
android:layout_centerInParent
="true"
android:text
="Title"
android:layout_toRightOf
="@id/dialog_title_image"
android:textColor
="#000000"
android:textSize
="30sp"
/>
</
RelativeLayout
>
<
TextView
android:layout_width
="fill_parent"
android:layout_height
="1dip"
android:background
="@drawable/lins"
android:layout_marginTop
="5dip"
/>
<
TextView
android:layout_width
="fill_parent"
android:layout_height
="wrap_content"
android:text
="This is a custom dialog"
android:textColor
="#000000"
android:layout_marginTop
="10dip"
android:layout_marginLeft
="30dip"
/>
<
RelativeLayout
android:layout_width
="fill_parent"
android:layout_height
="wrap_content"
android:paddingTop
="10dip"
android:gravity
="bottom|center_horizontal"
android:paddingBottom
="10dip"
>
<
Button
android:id
="@+id/dialog_button_cancel"
android:layout_alignParentLeft
="true"
android:layout_width
="100dip"
android:layout_height
="wrap_content"
android:text
="確定"
/>
<
Button
android:id
="@+id/dialog_button_ok"
android:layout_width
="100dip"
android:layout_height
="wrap_content"
android:layout_toRightOf
="@id/dialog_button_cancel"
android:layout_marginLeft
="35dip"
android:text
="取消"
/>
</
RelativeLayout
>
</
LinearLayout
>
最主要的,是自定義的Style,我們自定義一個(gè)式樣,用來(lái)改變默認(rèn)的Dialog樣式
在values文件夾下新建一個(gè)styles.xml文件,如下。。。
<?
xml version="1.0" encoding="utf-8"
?>
<
resources
>
<
style
name
="MyDialog"
parent
="@android:Theme.Dialog"
>
<item name="android:windowFrame">@null</item> <item name="android:windowNoTitle">true</item> <item name="android:windowBackground">@drawable/dialog_bg</item> <item name="android:windowIsFloating">true</item> <item name="android:windowContentOverlay">@null</item>
</
style
>
</
resources
>
這樣應(yīng)該就OK了,為了方便大家測(cè)試本示例,在此一并附上不怎么好看的素材。。。
注意,這里有三張圖片,第三張圖片是一條線,在自定義的式樣的時(shí)候取消了標(biāo)題欄,為了美觀,添加此線條,看上去還是有標(biāo)題欄的感覺(jué)。。。在此基本上完成了。
由于水平有限,這些內(nèi)容基本上都是在網(wǎng)上找的,然后自己整理了一下,寫了一篇相對(duì)比較清晰的,如果大家還有什么疑問(wèn)的話,隨時(shí)可以跟我聯(lián)系,共同學(xué)習(xí)。。。
———————————————————————————憂傷的分割線——————————————————————————
不好意思,剛剛實(shí)測(cè)了一下,發(fā)現(xiàn)還有一個(gè)很簡(jiǎn)單的方法,在不改變前面的布局前提下,只需要修改主類(MyDialogActivity.java)
package
com.and.mydialog;
import
android.app.Activity;
import
android.app.AlertDialog;
import
android.app.Dialog;
import
android.content.DialogInterface;
import
android.os.Bundle;
import
android.view.KeyEvent;
import
android.view.LayoutInflater;
import
android.view.Menu;
import
android.view.MenuItem;
import
android.view.View;
import
android.view.View.OnClickListener;
import
android.widget.Button;
import
android.widget.Toast;
public
class
MyDialogActivity
extends
Activity {
/**
Called when the activity is first created.
*/
@Override
public
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button
=
(Button) findViewById(R.id.button1);
button.setOnClickListener(
new
OnClickListener() {
@Override
public
void
onClick(View v) {
//
Dialog dialog = new MyDialog(MyDialogActivity.this,
//
R.style.MyDialog);
//此處直接new一個(gè)Dialog對(duì)象出來(lái),在實(shí)例化的時(shí)候傳入主題
Dialog dialog = new Dialog(MyDialogActivity.this, R.style.MyDialog);
//
設(shè)置它的ContentView
dialog.setContentView(R.layout.dialog);
dialog.show();
}
});
}
}
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

