关于Android中的各种Dialog


这篇文章会持续更新,在学过过程中所有关于Dialog的知识都会记录在文章中


自定义Dialog

  • 首先编写一个类,以及一个布局文件
public class MobileSafeDialog extends Dialog {
    public MobileSafeDialog(Context context) {
        super(context);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        View view = View.inflate(Util.getContext(), R.layout.dialog_layout, null);
        setContentView(view);
        Window window = getWindow();
        WindowManager.LayoutParams params = window.getAttributes();
        params.gravity = Gravity.BOTTOM; //底部对齐
        window.setAttributes(params);
    }
}


----------
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#F48F78"
        android:textColor="#000000"
        android:padding="8dp"
        android:text="设置标题" />

    <ListView
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:divider="@android:color/darker_gray"
        android:dividerHeight="2dp">

    </ListView>
</LinearLayout>

这里写图片描述

这个效果实在是太差了,我们继续改进

  • 修改Dialog的样式
    我们找到系统定义的Dialog样式 Theme.Light -> Theme.Dialog.NoFrame

这里写图片描述

我们将这段样式文件拷贝到项目中的styles文件中,用来自定义Dialog的样式,然后再Dialog中引用这个样式

这里写图片描述

这里写图片描述

这样我们就引用了自己定义的样式,我们再来慢慢修改这个样式,让Dialog展现成我们想要的效果(有的人可能会疑惑,为什么系统有了我们还要定义呢,原因就是系统的样式我们是无法直接使用的,所以需要我们来自定义样式)

再来看下效果

这里写图片描述

大家可以结合这张图,来尝试改变上面属性的值,然后根据自己想要的效果来更改属性文件
最后如果想要宽度填充父窗口,看下面这段代码

public class MobileSafeDialog extends Dialog {
    public MobileSafeDialog(Context context) {
        super(context,R.style.MobileSafeDialogStyle);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        View view = View.inflate(Util.getContext(), R.layout.dialog_layout, null);
        setContentView(view);
        Window window = getWindow();
        WindowManager m = window.getWindowManager();
        WindowManager.LayoutParams params = window.getAttributes();
        params.gravity = Gravity.BOTTOM;
        params.width = m.getDefaultDisplay().getWidth(); //宽度为window的宽度
        window.setAttributes(params);
    }
}

最后一点定义Dialog的进入退出动画,Theme.Dialog -> windowAnimationStyle -> @style/Animation.Dialog

 <item name="windowEnterAnimation">@anim/dialog_enter</item>
 <item name="windowExitAnimation">@anim/dialog_exit</item>

后面发现是通过这两个属性来设置进入退出动画的,那么想要进入退出动画就很简单的啦

<style name="MobileSafeDialogAnim">
        <item name="android:windowEnterAnimation">@anim/dialog_enter</item>
        <item name="android:windowExitAnimation">@anim/dialog_exit</item>
</style>


----------
//进入动画代码
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="500"
    >
    <translate android:fromYDelta="100%" android:toYDelta="0"/>
</set>

//退出动画代码
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="500">
    <translate
        android:fromYDelta="0"
        android:toYDelta="100%" />
</set>

再将这个属性在自定义属性windowAnimationStyle中引用就行了

效果
 <style name="NotificationStyle" parent="android:Theme.Dialog">
     <!-- 去除背景黑色边框 -->
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowFrame">@null</item>
        <item name="android:textColor">@null</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:layout_width">match_parent</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:backgroundDimEnabled">false</item>
        <!-- 进入退出动画 -->
        <item name="android:windowAnimationStyle">@style/DialogAnim</item>
        <item name="android:windowCloseOnTouchOutside">false</item>
    </style>

    <style name="DialogAnim">
        <item name="android:windowEnterAnimation">@anim/enter_anim</item>
        <item name="android:windowExitAnimation">@anim/exit_anim</item>
    </style>

ProgressDialog

ProgressDialog dialog = new ProgressDialog(this);//这里需要注意的是使用的上下文必须是Activity,简单的来理解就是Dialog需要显示在Activity上。
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);// 设置进度条样式
dialog.setCancelable(false);//设置进度条是否可以消失
dialog.show();//显示对话框
dialog.dismiss();//隐藏对话框
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值