官方推荐DialogFragment,今天简单使用了一下,然后结合自己以前项目中遇到的问题,发现还是很好用的,所以决定以后就用DialogFragment了,特此总结。(关于Dialog转屏过程中会消失而且数据丢失,而DialogFragment可以记录数据的问题不再多说,网上比较多)
一.创建
关于创建有两种方式,都需要继承DialogFragment
a. 第一种,在onCreateDialog中创建
这种方式和我们之前的通过alertdialog生成弹窗方式一样,创建一个dialog,直接看代码:
public class CreatDialog extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getActivity());
LayoutInflater layoutInflater = getActivity().getLayoutInflater();
View v = layoutInflater.inflate(R.layout.dialogtext, null);
dialogBuilder.setView(v).setPositiveButton("ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getActivity(), "clicked", Toast.LENGTH_SHORT).show();
}
}).setNegativeButton("cancle", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
AlertDialog alertDialog = dialogBuilder.create();
return alertDialog;
}
}
在mainacitvity的的调用为:
public void click2(View v){
CreatDialog creatDialog=new CreatDialog();
creatDialog.show(getFragmentManager(),"title");
}
效果图(R.layout.dialogtext2布局是个简单的线性布局,直接拖了一imageview两个textview,不再列出):
b. 第二种,在onCreateView中创建
public class MyDialog extends DialogFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.dialogtext2,container);
return view;
}
}
就是自己定义一个view,直接使用,在mainactivity的调用和上面一样:
public void click(View v){
MyDialog myDialog=new MyDialog();
myDialog.show(getFragmentManager(),"title");
}
效果图如下:
可以看到有空白title,在onCreateView调用去掉:getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);
二.常用设置
1.背景图片
我以前的一家公司喜欢用一些圆角卡通一些的点9图片做背景,这里也好设置:
首先去掉弹窗自己的背景,在onCreateView调用:
getDialog().getWindow().setBackgroundDrawableResource(android.R.color.transparent);
然后在我们自己的布局R.layout.xxx中将背景设为我们的图片:android:background="@mipmap/bg"即可
效果图(好丑,哈哈,主要知道去掉弹窗背景的方式就行了)
2.大小
a.在onCreate设置个主题,比如下面的,可以是宽度占慢这个屏幕setStyle(DialogFragment.STYLE_NO_TITLE, android.R.style.Theme_Holo_Light_Dialog_MinWidth);b.获取屏幕值,去设置大小效果图分别如下:@Override public void onStart() { super.onStart(); Dialog dialog = getDialog(); if (dialog != null) { DisplayMetrics dm = new DisplayMetrics(); getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm); dialog.getWindow().setLayout((int) (dm.widthPixels * 0.7), ViewGroup.LayoutParams.WRAP_CONTENT); } }
3.弹窗位置
和上面大小b方式相似,调用window.setGravity() dialog.getWindow().setGravity(Gravity.BOTTOM);
效果图:
4.添加动画
给window指定一个windowAnimations
dialogAnim是定义的弹窗styledialog.getWindow().getAttributes().windowAnimations = R.style.dialogAnim;
<style name="dialogAnim" mce_bogus="1" parent="android:Animation">
<item name="android:windowEnterAnimation">@anim/dialog_push_in</item>
<item name="android:windowExitAnimation">@anim/dialog_push_out</item>
</style>
效果图不再展示,就是一个从下往上进入的效果。
以上是我之前做项目中常遇到的一些用法,对于普通的弹窗来说应该已经足够了。针对一些list等特殊弹窗,等用到后再总结.....
---------------------------------------------------------------------------------大写分割线----------------------------------------------------------------------------------
实际使用过程中发现目前v7包下的dialog非常好用,现附上一段代码,仅供参考:
private void showCustomDialog(final int position) {
positionForImage=position;
//1.我们想要的view样式
LayoutInflater inflater = getLayoutInflater();
View v = inflater.inflate(R.layout.dialog_note_list, (ViewGroup) findViewById(R.id.dialog_notelist));
TextView tv_delete= (TextView) v.findViewById(R.id.dialog_notelist_tv1);
TextView tv_img= (TextView) v.findViewById(R.id.dialog_notelist_tv2);
TextView tv_save= (TextView) v.findViewById(R.id.dialog_notelist_tv3);
//2.创建dialog
android.support.v7.app.AlertDialog.Builder builder = new android.support.v7.app.AlertDialog.Builder(this);
builder.setView(v);
final AlertDialog dialog = builder.create();
dialog.show();
setDialogAttributes(dialog);
//3.事件处理
tv_delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
tv_img.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
tv_save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
}