美文网首页Android开发经验谈
Android 中常用的弹窗总结

Android 中常用的弹窗总结

作者: i小灰 | 来源:发表于2020-12-16 14:34 被阅读0次

简介:
Dailog 可以在当前的界面弹出一个对话框,这个对话框是置于所有界面元素之上的,能够屏蔽掉其他的交互能力,因此 Dialog 一般都是用于提示一些非常重要的内容或者警告信息。比如为了防止用户误删重要的内容,在删除前弹出一个确认对话框。

AlertDialog 对话框

 AlertDialog.Builder dialog = new AlertDialog.Builder(this);
        dialog.setTitle("提示");
        dialog.setCancelable(false);
        dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

            }
        });

        dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

            }
        });

        dialog.show();

ProgressDialog

ProgressDialog和 AlertDialog 有点类似,都可以在界面上弹出一个对话框,都能够屏蔽掉其他控件的交互能力。不同的是,ProgressDialog会在对话框中显示一个进度条,一般用于表示当前操作比较耗时,让用户耐心等待。

private void progressDialog() {

        ProgressDialog.Builder progressDialog = new ProgressDialog.Builder(this);
        progressDialog.setTitle("提示");
        progressDialog.setMessage("加载中.......");
        progressDialog.setIcon(R.drawable.ic_launcher_background);
        progressDialog.setCancelable(true);
        progressDialog.show();
    }

Activity 作为 Dialog

 <activity android:name=".activity.MyDialogActivity"
               android:theme="@style/dialogStyle"
            />

调用:

 public static void launch(SecondActivity secondActivity) {

        Intent intent = new Intent(secondActivity,MyDialogActivity.class);
        secondActivity.startActivity(intent);
    }

dialogStyle的代码

  <style name="dialogStyle" parent="Theme.AppCompat.Light.Dialog">
        <!--没有标题-->
        <item name="windowNoTitle">true</item>

        <!--背景透明-->
        <item name="android:windowIsTranslucent">true</item>
        <!--是否有覆盖-->
        <item name="android:windowContentOverlay">@null</item>
        <!--是否浮动-->
        <item name="android:windowIsFloating">true</item>
        <!--边框-->
        <item name="android:windowFrame">@null</item>
        <!--背景:透明-->
        <item name="android:windowBackground">@android:color/transparent</item>
        <!--dialog的整个屏幕的背景是否有遮障层-->
        <item name="android:backgroundDimEnabled">true</item>
        <!--dialog的高度-->
        <item name="android:height">200dp</item>
        <!--dialog的宽度,设置值超过最大宽度,就是屏幕的最大宽度-->
        <item name="android:width">500dp</item>

    </style>

XML 代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#FFFFFF"
    >

    <TextView
        android:layout_marginTop="10dp"
        android:id="@+id/tv_value"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Dialog页面"
        android:gravity="center"
        android:textColor="#FF0000"
        android:textSize="20dp"
        />

    <LinearLayout
        android:layout_marginTop="10dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <Button
            android:layout_weight="1"
            android:id="@+id/bt1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="取消"
            />

        <Button
            android:layout_weight="1"
            android:id="@+id/bt2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="确定"
            />
    </LinearLayout>

</LinearLayout>

注意:

1.若提示这个错误:Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.有两种修改方法。

方法一:把android:theme="@style/AlertDialog.AppCompat"改成android:theme="@style/Theme.AppCompat.Dialog"。

方法二:把AppCompatActivity改成 Activity

自定义Dialog


            //获取屏幕对象
            WindowManager windowManager = (WindowManager) getContext()
                    .getSystemService(Context.WINDOW_SERVICE);
            Display display = windowManager.getDefaultDisplay();

            // 获取Dialog布局
            View view = LayoutInflater.from(getContext()).inflate(R.layout.service_dialog_show_stop,null);

            // 获取自定义Dialog布局中的控件
            LinearLayout container = (LinearLayout) view.findViewById(R.id.container);
            TextView tv_confirm = (TextView) view.findViewById(R.id.tv_confirm);
            TextView tv_back = (TextView) view.findViewById(R.id.tv_back);
            TextView tv_content = view.findViewById(R.id.tv_content);

            String str = getString(R.string.service_stop)+"<font color='#FF0000'>"+ memberBean.getVipName() +"</font>"+getString(R.string.service_service);
            tv_content.setText( Html.fromHtml(str));
            // 定义Dialog布局和参数
            dialog = new Dialog(getContext(), com.burgeon.damai.loginmodule.R.style.AlertDialogStyle);
            dialog.setContentView(view);

            // 调整dialog背景大小
            container.setLayoutParams(new FrameLayout.LayoutParams((int) (display.getWidth() * 0.4), (int) (display.getHeight() * 0.32)));
            //确定
            tv_confirm.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //清空本地数据//隐藏布局
                    SPUtils.getInstance(SpConstant.MEMBERSINSERVICE).put(SpConstant.MEMBERSINSERVICE, "");
                    rlout_member_service.setVisibility(View.GONE);

                    //发送一个消息
                    EventBus.getDefault().post(new CloseVipService());
                    dialog.dismiss();

                }
            });

            //取消
            tv_back.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    dialog.dismiss();
                }
            });

            dialog.show();

Dialog 样式

 <!-- 自定义仿IOS的AlertDialog的样式 -->
    <style name="AlertDialogStyle" parent="@android:style/Theme.Dialog">
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowFrame">@null</item>
        <item name="android:backgroundDimEnabled">true</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowIsTranslucent">true</item>
    </style>

声明一个 Style 样式:

<style name="ActivityDialogStyle" parent="Theme.AppCompat.NoActionBar">
    <!--设置dialog的背景-->
    <item name="android:windowBackground">@android:color/transparent</item>
    <!--设置Dialog的windowFrame框为无-->
    <item name="android:windowFrame">@null</item>
    <!--设置无标题-->
    <item name="android:windowNoTitle">true</item>
    <!--是否浮现在activity之上-->
    <item name="android:windowIsFloating">true</item>
    <!--是否半透明-->
    <item name="android:windowIsTranslucent">true</item>
    <!--设置窗口内容不覆盖-->
    <item name="android:windowContentOverlay">@null</item>
    <!--设置动画-->
    <item name="android:windowAnimationStyle">@style/DialogScaleAnim</item>
    <!--背景是否模糊显示-->
    <item name="android:backgroundDimEnabled">true</item>
</style>

相关文章

网友评论

    本文标题:Android 中常用的弹窗总结

    本文链接:https://www.haomeiwen.com/subject/msnoiktx.html