本文我们一起来学习 DialogFragment 的用法。
二、DialogFragment 的基本使用 1. 简单使用方法一:重写 onCreateDialog 方法, 返回一个创建的dialog对象就行,具体如下:
public class MyDialogFragment extends DialogFragment{
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return super.onCreateView(inflater, container, savedInstanceState);
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog dialog = new AlertDialog.Builder(getActivity())
.setTitle("神灯")
.setMessage("来选择你要实现的一个愿望把")
.setPositiveButton("车子", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.setNegativeButton("房子", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).create();
return dialog;
}
public class MainActivity extends AppCompatActivity {
MyDialogFragment dialogFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dialogFragment = new MyDialogFragment();
dialogFragment.show(getSupportFragmentManager(),"dialog");
}
}
方法二:通过 onCreateView 来返回一个自己写好的 view 来完成,默认会在居中显示
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.dialog_my_test,null);
return view;
}
采用接口回调传递数据
AlertDialog.Builder builder = new AlertDialog.Builder(getContext())
.setTitle("选择头像")
.setPositiveButton("相册", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if(callback!=null){
callback.onPhoto();
}
}
})
.setNegativeButton("相机", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if(callback!=null){
callback.onCamera();
}
}
});
return builder.create();
private Callback callback;
public interface Callback{
void onPhoto();
void onCamera();
}
public void setCallback(Callback callback) {
this.callback = callback;
}
//使用的地方
SelectPhotoFragment selectPhotoFragment = new SelectPhotoFragment();
selectPhotoFragment.show(getSupportFragmentManager(), "photo");
selectPhotoFragment.setCallback(new SelectPhotoFragment.Callback() {
@Override
public void onPhoto() {
openCreame();
}
@Override
public void onCamera() {
}
});
2. 全屏显示 dialog
在5.0以上的版本中,我们在style中可以查看默认的dialog风格,其实有设置dialog的一些属性,自己定义一种类型的dialog,然后继承就可以修改整体dialog中的风格了,默认动画,背景颜色,或者宽度之类的都是可以的如下:
100%
100%
@android:color/transparent
@style/MyMinDialogWidth
@style/MyMinDialogWidth
//Theme.AppCompat.Dialog主题常用的一般有以下属性:
@android:color/transparent
@null
true
true
true
@android:color/transparent
true
0.5
这样我们就可以自由的操作布局控件,设置大小了。或者继承一个dialog在代码中设置
//给dialog设置弹出动画
getWindow().setWindowAnimations(R.style.dialog_animtion_style);
//设置dialog的大小
WindowManager.LayoutParams lp=getWindow().getAttributes();
lp.width=WindowManager.LayoutParams.MATCH_PARENT;
lp.height=WindowManager.LayoutParams.WRAP_CONTENT;
/*lp.gravity= Gravity.BOTTOM;*/
getWindow().setAttributes(lp);
其实由于 dialog 的默认效果是在中间显示,有时候我们需要让他显示在顶部或者底部,上面代码注释掉的地方可以修改 gravity 来达到效果。
有时候需要设置 dialog 的弹出和退出时候的动画,其实也是在 style 中设置一下就行,这样就可以定义自己想要实现的效果
@anim/dialog_show_anim
@anim/dialog_miss_anim
三、第三方开源库 NiceDialog
简介
DialogFragment 是 Android3.0 引入的,也是官方推荐来创建对话框的,兼具 dialog 以及 Fragment 的特性。接下来在 DialogFragment 的基础上实现我们的 NiceDialog,我们实现的 dialog 要能够简单的使用,也要易扩展,同时支持 BottomDialog,让 dialog 的使用更方便。
效果图1. 添加 JitPack 仓库 在当前项目等根目录下的 build.gradle 文件中添加如下内容:
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
2. 添加项目依赖
dependencies {
compile 'com.github.Othershe:NiceDialog:1.1.1'
}
3. 配置、展示 dialog
NiceDialog.init()
.setLayoutId(R.layout.dialog) //设置 dialog 布局文件
.setConvertListener(new ViewConvertListener() { //进行相关 View 操作的回调
@Override
public void convertView(ViewHolder holder, final BaseNiceDialog dialog) {
//如果需要找布局中相应的控件;
Button mBtnCancel =(Button)holder.getConvertView().findViewById(R.id.cancel);
//如果只需要控件的点击事件
viewHolder.setOnClickListener(R.id.cancel, new View.OnClickListener() {
@Override
public void onClick(View view) {
dialog.dismiss();
}
});
}
})
.setDimAmount(0.3f) //调节灰色背景透明度[0-1],默认 0.5f
.setShowBottom(true) //是否在底部显示 dialog,默认flase
.setMargin() //dialog 左右两边到屏幕边缘的距离(单位:dp),默认0dp
.setWidth() //dialog 宽度(单位:dp),默认为屏幕宽度
.setHeight() //dialog 高度(单位:dp),默认为WRAP_CONTENT
.setOutCancel(false) //点击 dialog 外是否可取消,默认true
.setAnimStyle(R.style.EnterExitAnimation) //设置dialog进入、退出的动画style(底部显示的 dialog 有默认动画)
.show(getSupportFragmentManager()); //显示dialog
注意: setMargin()和setWidth()选择一个即可
4. 逻辑代码
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void share(View view) {
NiceDialog.init()
.setLayoutId(R.layout.share_layout) //设置dialog布局文件
.setConvertListener(new ViewConvertListener() {
@Override
public void convertView(ViewHolder viewHolder, BaseNiceDialog baseNiceDialog) {
//dialog 中 view 的点击事件
viewHolder.setOnClickListener(R.id.wechat, new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this,"进入微信中...",Toast.LENGTH_SHORT).show();
}
});
}
})
.setDimAmount(0.3f)
.setShowBottom(true)
.setOutCancel(true)
.setAnimStyle(R.style.EnterExitAnimation)
.show(getSupportFragmentManager());
}
public void setFriend(View view) {
NiceDialog.init()
.setLayoutId(R.layout.friend_set_layout)
.setConvertListener(new ViewConvertListener() {
@Override
public void convertView(ViewHolder holder, final BaseNiceDialog dialog) {
}
})
.setShowBottom(true)
.setHeight(310)
.show(getSupportFragmentManager());
}
public void commit(View view) {
NiceDialog.init()
.setLayoutId(R.layout.commit_layout)
.setConvertListener(new ViewConvertListener() {
@Override
public void convertView(ViewHolder holder, final BaseNiceDialog dialog) {
final EditText editText = holder.getView(R.id.edit_input);
editText.post(new Runnable() {
@Override
public void run() {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, 0);
}
});
}
})
.setShowBottom(true)
.show(getSupportFragmentManager());
}
public void openRed(View view) {
NiceDialog.init()
.setLayoutId(R.layout.ad_layout)
.setConvertListener(new ViewConvertListener() {
@Override
public void convertView(ViewHolder holder, final BaseNiceDialog dialog) {
holder.setOnClickListener(R.id.close, new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
}
})
.setWidth(210)
.setOutCancel(false)
.setAnimStyle(R.style.EnterExitAnimation)
.show(getSupportFragmentManager());
}
public void load(View view) {
NiceDialog.init()
.setLayoutId(R.layout.loading_layout)
.setWidth(100)
.setHeight(100)
.setDimAmount(0)
.show(getSupportFragmentManager());
}
public void sure(View view) {
ConfirmDialog.newInstance("1")
.setMargin(60)
.setOutCancel(false)
.show(getSupportFragmentManager());
}
public void sure02(View view) {
ConfirmDialog.newInstance("2")
.setMargin(60)
.setOutCancel(false)
.show(getSupportFragmentManager());
}
public static class ConfirmDialog extends BaseNiceDialog {
private String type;
public static ConfirmDialog newInstance(String type) {
Bundle bundle = new Bundle();
bundle.putString("type", type);
ConfirmDialog dialog = new ConfirmDialog();
dialog.setArguments(bundle);
return dialog;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle bundle = getArguments();
if (bundle == null) {
return;
}
type = bundle.getString("type");
}
@Override
public int intLayoutId() {
return R.layout.confirm_layout;
}
@Override
public void convertView(ViewHolder holder, final BaseNiceDialog dialog) {
if ("1".equals(type)) {
holder.setText(R.id.title, "提示");
holder.setText(R.id.message, "您已支付成功!");
} else if ("2".equals(type)) {
holder.setText(R.id.title, "警告");
holder.setText(R.id.message, "您的账号已被冻结!");
}
holder.setOnClickListener(R.id.cancel, new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
holder.setOnClickListener(R.id.ok, new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
}
}
}