很多时候系统自带的对话框无法满足我们在工作上的需求,这时,自定义对话框就显的很重要了。今天就带领大家使用自定义布局来写出自己所需要的对话框。
下面一张对话框图就是等下我们所要做的对话框:
虽然布局丑了点,但是本着大家都能看的懂的原则,我都是使用系统自带的颜色和图片来做的,省的资源和样式用多了,怕有的人看的很莫名其妙,这里只是给个思想,只要你有图片有资源,你就可以做成任何样式的对话框。
我们要做成这样的对话框,其实很简单,首先,我们要在xml中把布局布置成这样上图的样子。然后对话框加载自定义的布局就能显示这样的效果。这里关键的是就是怎么样对确定和取消这两个按钮设置单击事件。这里我们就需要设置回调接口了,让单击所做的事件回调出去让用户处理就行了,不懂的话等下看下代码就知道了。
布局我就不多说了,都是简单的布局,下面自己看代码,我们要使用自定义的对话框,我们就需要修改系统自带对话框的风格,简单说就是要使用自定义的style,当然我们不必重写对话框的每个属性,我们只需修改几个系统的属性就ok了,这个很重要,下面给出我写的自定义style,并给出解释:
<style name="model_dialog" parent="android:style/Theme.Dialog"> <!--继承系统对话框-->
<item name="android:windowFrame">@null</item>
<!--Dialog的windowFrame框为无-->
<item name="android:windowNoTitle">true</item>
<!--是否显示标题-->
<item name="android:windowBackground">@color/not_color</item>
<!--设置dialog的背景-->
<item name="android:windowIsFloating">true</item>
<!--是否浮在activity上-->
<item name="android:windowContentOverlay">@null</item>
<!--对话框是否有遮盖-->
<item name="android:backgroundDimEnabled">false</item>
<!--背景是否变暗-->
<item name="android:windowIsTranslucent">false</item>
<!--是否半透明-->
</style>
其实上面有的属性和系统对话框属性是一致的,但是我为了说明常用的对话框主题属性就拿出来说明下,好了下面就上代码,关键地方我都给出了注释。
布局文件tipdialog.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="54dp"
android:background="#00ff00"
android:orientation="horizontal">
<FrameLayout
android:layout_width="44dp"
android:layout_height="match_parent" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/ic_launcher" />
</FrameLayout>
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="match_parent" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:singleLine="true"
android:textSize="32sp"
android:text="信息提示" />
</FrameLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#00ff00"
android:orientation="vertical" >
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ffff00"
>
<TextView
android:id="@+id/content_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:singleLine="false"
android:textSize="24sp"
android:gravity="left" />
</FrameLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<FrameLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" >
<Button
android:id="@+id/confirm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:clickable="true"
android:textSize="36sp"
android:text="确定" />
</FrameLayout>
<FrameLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" >
<Button
android:id="@+id/cancel"
android:textSize="36sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:clickable="true"
android:text="取消" />
</FrameLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<Button
android:id="@+id/button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="Click"
android:text="弹出自定义对话框"
/>
</RelativeLayout>
自己写的封装的自定义对话框
MyDialog.java
package com.example.customdialog;
import android.app.Dialog;
import android.content.Context;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MyDialog extends Dialog implements View.OnClickListener {
private Context context;
public MyDialog(Context context) {
super(context,R.style.model_dialog);//使用自定义主题
setContentView(R.layout.tipdialog);//设置自定义布局
this.context = context;
init();
}
public MyDialog(Context context,int msg){
super(context,R.style.model_dialog);
setContentView(R.layout.tipdialog);
this.context = context;
TextView content = (TextView)findViewById(R.id.content_text);
content.setText(msg);
init();
}
private void init() {
setCancelable(false);//取消返回事件
setCanceledOnTouchOutside(false);//点击对话框外的事件无效
Button confirm = (Button)findViewById(R.id.confirm);
Button cancle = (Button)findViewById(R.id.cancel);
confirm.setOnClickListener(this);//设置点击事件
cancle.setOnClickListener(this);
}
@Override
public void onClick(View view) {
int id = view.getId();
if(mClickListener == null){
return;
}
if(id == R.id.confirm){
mClickListener.onConfirmClick(this);//回调接口
}else{
mClickListener.onCancleClick(this);
}
}
public ClickListener mClickListener;
public MyDialog setClickListener(ClickListener clickListener){
mClickListener = clickListener;
return this;
}
public interface ClickListener{
void onConfirmClick(MyDialog myDialog);
void onCancleClick(MyDialog myDialog);
}
}
主Activity:MainActivity.java
package com.example.customdialog;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
init();
}
private void init() {
button = (Button)findViewById(R.id.button);
}
public void Click(View view){
showDialog();
}
public void showDialog(){
final MyDialog dialog = new MyDialog(this,"退出程序?");
dialog.setClickListener(new MyDialog.ClickListener() {
@Override
public void onConfirmClick(MyDialog myDialog) {
Toast.makeText(getApplicationContext(), "点击了确定按钮", Toast.LENGTH_SHORT).show();
dialog.cancel();
}
@Override
public void onCancleClick(MyDialog myDialog) {
Toast.makeText(getApplicationContext(), "点击了取消按钮", Toast.LENGTH_SHORT).show();
dialog.cancel();
}
});
dialog.show();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
color.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="not_color">#00000000</color>
</resources>