一.摘要
弹窗通常用于提示用户进行某种操作,比如:点击分享按钮,弹窗分享对话框;双击返回按钮,弹窗退出对话框;下载文件,提示下载对话框等等,分享对话框/退出对话框/下载对话框,都可以直接使用AlertDialog实现,类似的效果如下图:
二.AlertDialog基础知识
AlertDialog无法直接通过new关键字获取对象,调用方法:new AlertDialog.Builder.create()获取AlertDialog对象,这个时候容易让人疑惑的是:如何设置对话框的属性?比如:对话框标题,对话框消息,对话框按钮等等
设置对话框属性的两种方式
第一种:设置AlertDialog对象属性,具体代码如下:
private void showDialog() { AlertDialog mDialog = null; mDialog = new AlertDialog.Builder(this).create();; mDialog.setIcon(R.drawable.ic_launcher); mDialog.setTitle("系统提示"); mDialog.setMessage("你确定要退出吗?"); mDialog.setButton(DialogInterface.BUTTON_POSITIVE,"确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finishMyself(); } }); mDialog.setButton(DialogInterface.BUTTON_NEGATIVE,"取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(MainActivity.this, "再按一次退出程序", (int) touchTime) .show(); } }); mDialog.show(); }
第二种:设置Builder对象属性,具体代码如下:
private void showDialog() { AlertDialog mDialog = null; Builder mBuilder = new AlertDialog.Builder(this); mBuilder.setIcon(R.drawable.ic_launcher); mBuilder.setTitle("系统提示"); mBuilder.setMessage("你确定要退出吗?"); mBuilder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); } }); mBuilder.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(MainActivity.this, "再按一次退出程序", (int) touchTime) .show(); } }); mDialog = mBuilder.create();//创建AlertDialog对象 mDialog.show();//显示创建的AlertDialog }
这两种方式的对话框展示默认属性——对话框水平垂直居中显示,对话框与左右窗体之间有一小段距离,效果图如下:
如何修改默认对话框属性?
如何修改AlertDialog对话框默认属性,然后实现对话框内容宽度布满屏幕,高度根据内容自适应,类似文章开头点击分享按钮,从底部弹出弹窗的效果。首先创建AlertDialog对话框,然后自定义对话框的布局View,最后设置Window对象属性。
设置Window对象屏幕宽度/高度的三种方式
第一种方式:setLayout()
获得Window对象后,设置Window对象的布局参数,即调用setLayout(int width,int height)方法,width取值:android.view.WindowManager.LayoutParams.MATCH_PARENT/android.view.WindowManager.LayoutParams.WRAP_CONTENT,同理height取值:android.view.WindowManager.LayoutParams.MATCH_PARENT/android.view.WindowManager.LayoutParams.WRAP_CONTENT,具体代码如下:
View view = getLayoutInflater().inflate(R.layout.popup_dialog, null); AlertDialog mDialog = new AlertDialog.Builder(this).create(); mDialog.show();// 显示创建的AlertDialog,并显示,必须放在Window设置属性之前 /** *设置mDialog窗口属性:MATCH_PARENT/WRAP_CONTENT * */ Window window =mDialog.getWindow(); window.setGravity(Gravity.BOTTOM); // 此处可以设置dialog显示的位置 window.setLayout(android.view.WindowManager.LayoutParams.MATCH_PARENT, android.view.WindowManager.LayoutParams.WRAP_CONTENT);
第二种方式:setAttributes()
获得Window对象后,设置Window对象的属性值,即调用setAttributes(LayoutParams)方法,LayoutParams的width变量取值:android.view.WindowManager.LayoutParams.MATCH_PARENT/android.view.WindowManager.LayoutParams.WRAP_CONTENT,同理height变量取值:android.view.WindowManager.LayoutParams.MATCH_PARENT/android.view.WindowManager.LayoutParams.WRAP_CONTENT,具体代码如下:
View view = getLayoutInflater().inflate(R.layout.popup_dialog, null); AlertDialog mDialog = new AlertDialog.Builder(this).create(); mDialog.show();// 显示创建的AlertDialog,并显示,必须放在Window设置属性之前 Window window =mDialog.getWindow(); window.setGravity(Gravity.BOTTOM); // 此处可以设置dialog显示的位置 WindowManager.LayoutParams mParams = window.getAttributes(); mParams.width = android.view.WindowManager.LayoutParams.MATCH_PARENT; mParams.height = android.view.WindowManager.LayoutParams.WRAP_CONTENT; window.setGravity(Gravity.BOTTOM); // 此处可以设置dialog显示的位置 window.setAttributes(mParams);
第三种方式:setLayout()
具体代码如下:
View view = getLayoutInflater().inflate(R.layout.popup_dialog, null); AlertDialog mDialog = new AlertDialog.Builder(this).create(); mDialog.show();// 显示创建的AlertDialog,并显示,必须放在Window设置属性之前 Window window =mDialog.getWindow(); window.setGravity(Gravity.BOTTOM); // 此处可以设置dialog显示的位置 WindowManager manager = getWindowManager(); Display display = manager.getDefaultDisplay(); int width = display.getWidth();//获取当前屏幕宽度 int height = 300;//自定义高度值,比如:300dp window.setGravity(Gravity.BOTTOM); // 此处可以设置dialog显示的位置 window.setLayout(width, height);
三.弹窗动画基础知识
Android的基本动画包括:渐变动画/平移动画/缩放动画/旋转动画/组合动画,点击“分享”按钮,弹窗从底部弹窗,再次点击弹窗消失,设置的动画——平移动画,代码如下:
<?xml version="1.0" encoding="utf-8"?> <!--enter_dialog_anim.xml,弹窗进入动画--> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="300" android:fromYDelta="100%"> </translate> <?xml version="1.0" encoding="utf-8"?> <!--exit_dialog_anim.xml,弹窗退出动画--> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="300" android:toYDelta="100%" > </translate>
在style.xml文件中添加Window进入和退出分别引用的动画类型,代码如下:
<!-- 分享功能弹窗动画 --> <style name="popup_style" parent="android:Animation"> <item name="@android:windowEnterAnimation">@anim/enter_dialog_anim</item> <item name="@android:windowExitAnimation">@anim/exit_dialog_anim</item> </style>
在Window属性设置中调用setContentView()指定View对象,同时调用setWindowAnimations()指定添加的动画,代码如下:
window.setContentView(view);//这一步必须指定,否则不出现弹窗
window.setWindowAnimations(R.style.popup_style); // 添加动画
四.自定义弹窗:MyDialogActivity
自定义MyDialogActivity实现AlertDialog同样的功能,点击“分享按钮”,从窗口底部弹出弹窗,点击“取消”弹窗消息,最终效果和AlertDialog实现的弹窗效果一模一样,如下图:
开发步骤:
1.定义布局popup_main.xml。popup_main.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:background="@color/transparent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:id="@+id/share_weibo_tv" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_margin="@dimen/share_padding" android:layout_weight="1" android:gravity="center_horizontal" android:text="@string/weibo" /> <TextView android:id="@+id/share_weixin_tv" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_margin="@dimen/share_padding" android:layout_weight="1" android:gravity="center_horizontal" android:text="@string/weixin" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:id="@+id/share_kongjian_tv" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_margin="@dimen/share_padding" android:layout_weight="1" android:gravity="center_horizontal" android:text="@string/kongjian" /> <TextView android:id="@+id/share_qq_tv" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_margin="@dimen/share_padding" android:layout_weight="1" android:gravity="center_horizontal" android:text="@string/qq" /> </LinearLayout> <Button android:id="@+id/cancel_btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="@dimen/activity_vertical_margin" android:background="@drawable/btn_bg" android:text="@string/cancel" /> </LinearLayout>
2.定义Theme样式。Theme样式定义在style.xml文件中,在AndroidManifest.xml文件中的标签的android:theme=""属性中引用,代码如下:
<!-- MyDialogActivity自定义Threme --> <style name="Theme.CustomDialog" parent="@android:style/Theme.Dialog"> <item name="android:windowNoTitle">true</item> <!-- 设置title --> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowFrame">@null</item> <!-- 设置边框 --> <item name="android:windowIsTranslucent">true</item> <!-- 设置半透明 --> <item name="android:windowFullscreen">true</item> <!-- 设置全屏 --> </style> <activity android:name="MyDialogActivity" android:theme="@style/Theme.CustomDialog"/>
3.实现MyDialogActivity具体功能。
package cn.teachcourse.main; import android.annotation.SuppressLint; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.view.Gravity; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.widget.Button; import android.widget.TextView; /* @author postmaster@teachcourse.cn @date 创建于:2016-4-14 */ public class MyDialogActivity extends Activity implements OnClickListener { private View view; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); view = getLayoutInflater().inflate(R.layout.popup_main, null, false); setContentView(view); initView(); } private void initView() { Window window = getWindow(); window.setLayout(android.view.ViewGroup.LayoutParams.MATCH_PARENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT); window.setGravity(Gravity.BOTTOM); window.setWindowAnimations(R.style.popup_style); // 添加动画 TextView weibo_tv = (TextView) view.findViewById(R.id.share_weibo_tv); TextView weixin_tv = (TextView) view.findViewById(R.id.share_weixin_tv); TextView qq_tv = (TextView) view.findViewById(R.id.share_qq_tv); TextView kongjian_tv = (TextView) view .findViewById(R.id.share_kongjian_tv); Button cancel_btn = (Button) view.findViewById(R.id.cancel_btn); // 添加控件事件 weibo_tv.setOnClickListener(this); weixin_tv.setOnClickListener(this); qq_tv.setOnClickListener(this); kongjian_tv.setOnClickListener(this); cancel_btn.setOnClickListener(this); // 调整图片的大小/位置 abjustDrawablePos(weibo_tv, R.drawable.share_weibo); abjustDrawablePos(weixin_tv, R.drawable.share_weixin); abjustDrawablePos(kongjian_tv, R.drawable.share_kongjian); abjustDrawablePos(qq_tv, R.drawable.share_qq); } /** * 添加图标和调整位置 * * @param tv * @param draw */ @SuppressLint("ResourceAsColor") private void abjustDrawablePos(TextView tv, int draw) { Bitmap mBitmap = BitmapFactory.decodeResource(getResources(), draw); mBitmap = centerSquareScaleBitmap(mBitmap, 250); Drawable drawable = new BitmapDrawable(mBitmap); drawable.setBounds(0, 48, 0, 48);// 设置图片的边界 tv.setTextColor(R.color.fontcolor); tv.setCompoundDrawables(null, drawable, null, null);// setCompoundDrawables()和setBounds()方法一起使用 // 添加TextView图标 tv.setCompoundDrawablesWithIntrinsicBounds(null, drawable, null, null); tv.setCompoundDrawablePadding(10);// 设置图片和text之间的间距 if (mBitmap != null) { mBitmap = null; drawable = null; } } /** * * @param bitmap * 原图 * @param edgeLength * 希望得到的正方形部分的边长 * @return 缩放截取正中部分后的位图。 */ public static Bitmap centerSquareScaleBitmap(Bitmap bitmap, int edgeLength) { if (null == bitmap || edgeLength <= 0) { return null; } Bitmap result = bitmap; int widthOrg = bitmap.getWidth(); int heightOrg = bitmap.getHeight(); if (widthOrg >= edgeLength && heightOrg >= edgeLength) { // 压缩到一个最小长度是edgeLength的bitmap int longerEdge = (int) (edgeLength * Math.max(widthOrg, heightOrg) / Math .min(widthOrg, heightOrg)); int scaledWidth = widthOrg > heightOrg ? longerEdge : edgeLength; int scaledHeight = widthOrg > heightOrg ? edgeLength : longerEdge; Bitmap scaledBitmap; try { scaledBitmap = Bitmap.createScaledBitmap(bitmap, scaledWidth, scaledHeight, true); } catch (Exception e) { return null; } // 从图中截取正中间的正方形部分。 int xTopLeft = (scaledWidth - edgeLength) / 2; int yTopLeft = (scaledHeight - edgeLength) / 2; try { result = Bitmap.createBitmap(scaledBitmap, xTopLeft, yTopLeft, edgeLength, edgeLength); scaledBitmap.recycle(); } catch (Exception e) { return null; } } return result; } @Override public void onClick(View v) { switch (v.getId()) { /** * 点击分享图标,弹出分享界面 */ case R.id.share_to_btn: break; case R.id.share_weibo_tv: break; case R.id.share_weixin_tv: break; case R.id.share_qq_tv: break; case R.id.share_kongjian_tv: break; case R.id.cancel_btn: finish(); break; default: break; } } }
4.弹出弹窗,调用startActivity(this,MyDialogActivity.class)。
以上就是本文的全部内容,希望对大家学习Android软件编程有所帮助。
本文向大家介绍Android实现加载对话框,包括了Android实现加载对话框的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Android实现加载对话框的具体代码,供大家参考,具体内容如下 这里简单说一下两种实现加载对话框的方式:1.使用动画让一个图片旋转 2.使用progressbar。 感觉简单来说,dialog就是一个弹出的window,把自己定义的布局放置到window里面
对话框的内容不是在页面最初可见,而是在用户操作时显示额外的信息。 Toasts Materialize 提供了非常简单的方法,来弹出一些信息,同时也不会让用户感到突兀。这些 Toasts 显示的位置和大小会随着你的设备的不同而改变。 在 JavaScript 中调用 Materialize.toast() 方法来使用。 // Materialize.toast(message, displayLe
对话框是一个现代GUI应用不可或缺的一部分。对话是两个人之间的交流,对话框就是人与电脑之间的对话。对话框用来输入数据,修改数据,修改应用设置等等。 输入文字 QInputDialog提供了一个简单方便的对话框,可以输入字符串,数字或列表。 #!/usr/bin/python3 # -*- coding: utf-8 -*- """ ZetCode PyQt5 tutorial In this
打开或保存文件,弹出警告等对话框 进程: 主进程 选择多个文件和目录的对话框: 1 const {dialog} = require('electron') 2 console.log(dialog.showOpenDialog({properties: ['openFile', 'openDirectory', 'multiSelections']})) Copied! 对话框默认是在主线程中
显示用于打开和保存文件、警报等的本机系统对话框。 线程:主线程 显示用于选择多个文件和目录的对话框的示例: const { dialog } = require('electron') console.log(dialog.showOpenDialog({ properties: ['openFile', 'openDirectory', 'multiSelections'] })) 这个对话框是
如果有很多输入超出了菜单可以处理的程度,那么我们可以使用对话框来取得输入信息。程序写作者可以通过在某选项后面加上省略号(…)来表示该菜单项将启动一个对话框。 对话框的一般形式是包含多种子窗口控件的弹出式窗口,这些控件的大小和位置在程序资源描述文件的「对话框模板」中指定。虽然程序写作者能够「手工」定义对话框模板,但是现在通常是在Visual C++ Developer Studio 中以交谈式操作的