DialogFragment使用记录

官方推荐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
  dialog.getWindow().getAttributes().windowAnimations = R.style.dialogAnim;
dialogAnim是定义的弹窗style
    <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) {
              
            }
        });
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值