实现步骤:
1、自定义需要的布局
2、创建适配器,适配布局
3、调用自定义对话框
详解:
1、自定义需要的布局
我需要的布局(view_bomb_box.xml)效果是这样的

其实自定义就是根据自己需要自己定义,相信大家都会布局的,下面是我的布局
<?xml version="1.0" encoding="utf-8"?>
<!--自定义弹框布局-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--占位置,让弹框居中-->
<LinearLayout
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="0dp"></LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/radius_bomb_box"
android:orientation="vertical">
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="15dp"
android:paddingBottom="15dp"
android:paddingLeft="100dp"
android:paddingRight="100dp"
android:gravity="center"
android:textColor="#22f5cf"
android:textSize="18dp"
android:text="自定义标题"/>
<TextView
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:paddingBottom="20dp"
android:text="\t\t这里是弹框描述的内容!!!请问感觉这个弹框怎么样?"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="1px"
android:background="#d1cfcf"></LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/left"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:paddingBottom="15dp"
android:paddingTop="15dp"
android:gravity="center"
android:textColor="#22f5cf"
android:text="感觉一般"/>
<LinearLayout
android:layout_width="1px"
android:layout_height="match_parent"
android:background="#d1cfcf"></LinearLayout>
<TextView
android:id="@+id/right"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:paddingBottom="15dp"
android:paddingTop="15dp"
android:gravity="center"
android:textColor="#22f5cf"
android:text="感觉很好"/>
</LinearLayout>
</LinearLayout>
<!--占位置,让弹框居中-->
<LinearLayout
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="0dp"></LinearLayout>
</LinearLayout>
关键在于,需要控制的控件都有 id
标题 title 、弹框内容 content 、左边按钮 left 、右边按钮 right
可以根据 id 改变它们的文字内容 (如果你的布局中有图片,也是一样的)
布局中的背景样式为 radius_bomb_box.xml (在 drawable中)
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="15dp"/>
<solid android:color="#FFFFFF"/>
<stroke android:width="1dp" android:color="#ffffff" /><!-- 描边,边框宽度、颜色 -->
</shape>
2、创建适配器,适配布局
通过 id 和自定义 set 方法来实现赋值
自定义 MyBombBoxAdapter类 继承 Dialog
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.RadioGroup;
import android.widget.TextView;
import com.win.customview.R;
/**
* Created by Administrator on 2018/3/13 0013.
* 自定义弹框适配器
*/
//继承
public class MyBombBoxAdapter extends Dialog {
public MyBombBoxAdapter(Context context) {
super(context);
}
public MyBombBoxAdapter(Context context, int themeResId) {
super(context, themeResId);
}
public static class Builder {
private Context context; //上下文
private String title; //标题
private String content; //弹框内容
private String left; //左按钮
private String right; //右按钮
private View contentView; //视图
private DialogInterface.OnClickListener leftClick; //左按钮点击事件
private DialogInterface.OnClickListener rightClick; //右按钮点击事件
public Builder(Context context) { //传入上下文(弹框在哪里弹出)
this.context = context;
}
public Builder setTitle(String title) { //传入标题
this.title = title;
return this;
}
public Builder setContent(String content) { //传入弹框提示文字
this.content = content;
return this;
}
public Builder setLeft(String left, DialogInterface.OnClickListener listener) {
this.left = left; //传入左边按钮文字
this.leftClick = listener; //传入左边按钮点击事件
return this;
}
public Builder setRight(String right, DialogInterface.OnClickListener listener) {
this.right = right; //传入右边按钮文字
this.rightClick = listener; //传入右边按钮点击事件
return this;
}
//通过 id 进行适配
public MyBombBoxAdapter create() {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// 用自定义主题实例化对话框
final MyBombBoxAdapter dialog = new MyBombBoxAdapter(context, R.style.Dialog);
//绑定自定义的布局
View layout = inflater.inflate(R.layout.view_bomb_box, null);
//添加视图
dialog.addContentView(layout, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, RadioGroup.LayoutParams.WRAP_CONTENT));
//设置对话框标题 (根据 layout)
((TextView) layout.findViewById(R.id.title)).setText(title);
//设置对话框内容 (根据 layout)
((TextView) layout.findViewById(R.id.content)).setText(content);
//设置左边按钮(如果为空就不显示)
if(left != null){
((TextView) layout.findViewById(R.id.left)).setText(left);
if(leftClick != null){
((TextView) layout.findViewById(R.id.left)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
leftClick.onClick(dialog, DialogInterface.BUTTON_POSITIVE);
}
});
}
}else{
layout.findViewById(R.id.left).setVisibility(View.GONE);//隐藏按钮
}
//设置右边按钮(如果为空就不显示)
if(right != null){
((TextView) layout.findViewById(R.id.right)).setText(right);
if(rightClick != null){
((TextView) layout.findViewById(R.id.right)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
rightClick.onClick(dialog, DialogInterface.BUTTON_POSITIVE);
}
});
}
}else{
layout.findViewById(R.id.right).setVisibility(View.GONE);//隐藏按钮
}
dialog.setContentView(layout);
return dialog;
}
}
}
通过 set 方法或取到传入的容后,根据绑定的 布局(view_bomb_box.xml) 以及 id 分别赋值,
以达到需要的效果。
其中 R.style.Dialog 也是自己定义的,在 res/values/style 中加入:
!--自定义对话框的主题-->
<style name="Dialog" parent="android:style/Theme.Dialog">
<item name="android:background">#00000000</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">true</item>
</style> 这样
布局 和
适配 就完成了
3、调用自定义对话框
最后可以根据自己的需要调用这个自定义的弹框了,其核心代码为:
builder = new MyBombBoxAdapter.Builder(BombBoxActivity.this);
builder.setTitle("对话框");
builder.setContent("感觉好用吗?");
builder.setRight("还行", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//在这里实现点击 右边按钮 后需要实现的事件
Toast.makeText(BombBoxActivity.this,"真有眼光,我也觉得好用!",Toast.LENGTH_SHORT).show();
}
});
builder.setLeft("差评", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//在这里实现点击 左边按钮 后需要实现的事件
Toast.makeText(BombBoxActivity.this,"还有其他用法,看看在说吧!",Toast.LENGTH_SHORT).show();
}
});
builder.create().show();
可以看到,这里主要是实例化适配器后,根据开始在适配器中定义的 set 方法添加内容(根据自己需要)
这里的完整代码如下:
import android.content.DialogInterface;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.win.customview.R;
public class BombBoxActivity extends AppCompatActivity {
private Button bomb_box;//点击按钮弹框
private MyBombBoxAdapter.Builder builder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bomb_box);
bomb_box = (Button)findViewById(R.id.bomb_box);
bomb_box.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//在这里调用自定义弹框
builder = new MyBombBoxAdapter.Builder(BombBoxActivity.this);
builder.setTitle("对话框");
builder.setContent("感觉好用吗?");
builder.setRight("还行", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//在这里实现点击 右边按钮 后需要实现的事件
Toast.makeText(BombBoxActivity.this,"真有眼光,我也觉得好用!",Toast.LENGTH_SHORT).show();
}
});
builder.setLeft("差评", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//在这里实现点击 左边按钮 后需要实现的事件
Toast.makeText(BombBoxActivity.this,"还有其他用法,看看在说吧!",Toast.LENGTH_SHORT).show();
}
});
builder.create().show();
}
});
}
}
这样就实现了完整的自定义对话框!
这里只是一种视图样式,如果需要有一些图片、文字的改动,也只是需要在 布局 和 适配器 上做些改变就好了
在调用时,根据改变的内容 set 新的内容就好了
源码:https://github.com/iscopy/CustomView
在 bomb_box 包里面
|