A. 如何在android程序中的任意activity弹出对话框
任意Activity弹出对话框,那你可以用service 服务中弹出一个全局的
以下是代码
java">AlertDialog.Builderbuilder=newAlertDialog.Builder(this);
builder.setIcon(R.drawable.ic);
builder.setTitle("标题");
builder.setMessage("提示文字");
builder.setPositiveButton(R.string.btn_update,newOnClickListener(){
@Override
publicvoidonClick(DialogInterfacedialog,intwhich){
//增加按钮,回调事件
}
);
builder.setCancelable(false);//弹出框不可以换返回键取消
AlertDialogdialog=builder.create();
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);//将弹出框设置为全局
dialog.setCanceledOnTouchOutside(false);//失去焦点不会消失
dialog.show();
B. 来谈谈APP提示弹窗交互设计
移动端常见的提示弹窗可分为3类:提示框、泛Toast 和消息推送。
提示框是一种打断用户操作行为的弹窗,用户必须做出确认、取消等操作才能进行下一步。
常见的用法有功能引导(但别指望傲娇的用户会认真看)、弹出广告信息或者重要通知(虽然用户未必觉得有卵用还感觉有点烦)、提醒用户当前操作会发生什么事情(告诉用户别手贱,想好了再点)、耗时操作提示(安慰客官别着急,菜正在做着)、进行文本输入或功能设置(少跳转一个页面)。
功能引导一般是APP第一次安装、UI交互改版或者更新重要功能时对用户进行使用引导,增加用户对某功能的认知度,减轻用户对APP陌生感,避免了用户面对复(nǎo)杂(cán)交互时的一脸懵逼。
广告的弹窗最好是能抓人眼球。用户不是烦广告,而是烦对自己没用并且没趣的广告。
有一些操作是无法挽回的,所以需要增加一个确认提示,防止用户误触。
应用正常运行的时候缺少权限会使某些功能无法正常使用,但是乐视你一个薯片……哦不对,视频软件要我定位、通话这种敏感权限,不给还强制关闭APP,这是想干嘛?还是卸载了吧。
申请权限或者应用更新的提示框最好能把事情写详细,让用户明白授权权限或者升级APP对自己有什么好处。UC浏览器耍了个心眼,把取消按钮故意设计的不显眼,视觉上引导用户去点击“立即体验”按钮。
如果用户需要进行简单的设置或输入,可以用弹出操作框的形式减少界面跳转。但是操作框大小有限,如果是复杂设置的话最好还是跳转新的页面。
用户的耐心比金鱼的记忆时间还短。如果应用3秒没反应用户就会疑惑,5秒没反应用户就可能会觉得是出问题了而去尝试关闭。这时候就体现出了一个有趣的loding界面的重要性了。
为什么是泛Toast 呢,因为现在Toast 的玩法越来越多了。
Android官方设计规范里,Toast 是一种主要用于提示系统消息的轻量级控件,显示一段时间后自动消失,不包含操作也不能从屏幕上手动关闭,不会打断用户的操作,多个Toast 可以叠加出现。
之后Android针对轻量级反馈操作在Material Design中新增加了一种叫Snackbar 的控件。Snackbar 以一个小的弹出框的形式,出现在手机屏幕最底部,左侧为提示文本,右侧是操作按钮。Snackbar 不仅会超时自动消失,用户也可以滑动将其关闭,屏幕上同时最多只能显示一个 Snackbar。
Android官方设计规范里Toast 和Snackbar都应该保持简约,不对用户造成过多的打扰,所以不建议提示文本过长(显示时间有限,太长用户看不完),更不建议在其中增加图片和过多按钮。
但是有句名言说得好,规则就是用来打破的。
小米应用市场安装完APP后出现的Toast ,功能上是方便了用户,但是设计上不太好看。
豌豆荚的新版本升级提示用Snackbar 的形式出现,左侧有两个操作按钮。因为豌豆荚的这个Snackbar 是不自动消失的,除非用户点击操作按钮或者滑动才会关闭,所以不会出现用户正在纠结两个按钮该点哪个而Snackbar 超时自动消失的情况。但是一句“新版本已准备好了”就想让用户去升级,看来这版本也没多重要。
上面bilibili这个投币的交互设计挺有趣的,如果投币成功后弹出的Snackbar增加“再次投币”的操作按钮,一定能增加用户投币的数量。
很多APP为了更少的遮挡内容,将Toast移到了顶部。
传统的Toast样式低调,很容易被用户忽略,我们可以按照提示内容设计不同的颜色,也使得APP变得更加生动有趣。
消息推送的使用场景一般是应用处于非活跃状态(未启动或在后台里),为了避免用户错过重要信息而通过系统发出提示,点击消息可跳转到应用内相关页面。
消息推送也经常被用来促进用户活跃度,消息推送的频率和质量反映了一个团队对用户心理的掌握程度。优秀的运营应该对用户群进行详细分类,投其所好才能吸引用户点击,否则用户就会烦的禁止APP推送。
有用、好用、有趣,我觉得这是交互设计中最重要的三点。
1、有用:没有反馈的APP毫无生气,而各种乱弹窗又会使用户心烦到恨不得立刻卸载。所以反馈的信息一定是有价值的,让用户知道刚才发生了什么,接下来需要进行什么操作,一些显而易见的情景可以省略掉提示。
2、好用:提示控件的形式一定要把握好,不同的提示类型最好要区别展示。对话框会打断用户的操作,一般是处理重要事件,做好用户引导操作;toast是轻量级提示,不会打断用户的操作流程,提示的信息一定要言简意赅,显示时间不宜过长;消息推送最容易成为垃圾信息的重灾区,如果不能决定到底推送给用户哪些信息时,可以在设置里增加一些推送开关。
3、有趣:有趣的事情,大家都会喜欢。我相信即使是很讨厌广告的用户,在看到一个有趣的提示时也会十分感动然后把它关闭;即使是很讨厌等待的用户,在看到一个好玩的等待动画时也会会心一笑,然后时间就不知不觉的过去了。
C. 【弹窗】APP中如何更好的使用弹窗
设计师都会使用弹窗,但对于弹窗背后的分类及运用可能还不是特别了解,在写这篇文章之前,我查看了很多应用及资料,所以下面会有大量的案例,相信大家看完可以对弹窗的认识更明确,做设计规范的时候也能有自己的想法。
现在的弹窗分为两种,一种是模态弹窗(重提示),一种是非模态弹窗(轻提示)。
常见的模态弹窗:Dialog/Alert、Actionbar、Popover/Popup
常见的非模态弹窗:Toast/Hud、Tips、Snackbar
一、模态弹窗
Dialog/Alert 对话框
对话框是我们常用的弹窗,安卓开发语言是Dialog,iOS开发语言Alert,它通常出现在页面的中间,对话框/警示框的类别非常多,对用户的干扰比较大。前面之所以说模态弹窗是一种重提示,是因为它需要用户主动触发选择才可以继续当前的操作。
① 信息-选择确定
特点:这类弹窗通常是一些系统功能的授权、版本更新、消息通知、重要提示等,通常只有1~3个主按钮,只需要用户进行简单的选择。
② 信息-输入勾选
特点:这类弹窗通常是输入一些比较少的信息或者勾选信息,常用于备注输入、规格选择、分组选择等,通常只有确定和取消两个按钮。
③ 信息-传达展示
特点:这类弹窗通常是一些广告、红包优惠、节日活动等一些运营类弹窗,主要是吸引用户点击及参加活动,这类运营弹窗通常会设计的比较吸引人,造型各异,会突出领取、查看等大按钮,弱化关闭按钮。
Actionbar操作栏
Actionbar主要分为Action Views和Action Sheets。它们通常是由底部弹出,它的操作及信息会比对话框类型的弹窗更多更复杂。这种当前页面的下拉弹窗好处就是,可以让用户清楚的感知当前的操作,比跳转到新页面更加有安全感。还有一个特殊的抽屉式弹窗也顺便说一下。
① Action Views操作视图
特点:这类视图弹窗通常占屏比较多,以文字、图标等形式展示各种功能,也可以说这类的弹窗是一个小型的页面。它一般从底部弹出,不太强调归属,大多出现在购买、支付、分享等场景。
② Action Sheets 操作列表
特点:操作列表相对于操作视图,它更单一。主要是以文字展示功能按钮,重要敏感的功能操作一般会用主题颜色或红色显示,主要运用在一些日常控件、功能选择、删除、保存等场景。
③ 抽屉式弹窗
特点:这种抽屉式弹窗一般从左右两边弹出,经常运用在一些导航扩展和目录展示中,它能承载比较多的信息,基本上都是用来放一些不太常用的功能。
Popover/Popup 浮层
Popover是ios的开发语言,popup是安卓的开发语言,浮层是指,用户点击某个功能后浮出一个临时气泡对其作出补充,它通常会伴随着半透明的遮罩或者投影衬底,用户需要点击功能区域操作,或者点击空白处取消,才能进入下一步操作。它与上面操作栏的最大区别就在于,它更强调归属,可以出现在页面的任何地方,而操作栏一般只出现在底部,不强调归属。
① 指向浮层
特点:这类的浮层一般伴随有小三角指向,强调归属。气泡里面的功能通常以单一的文字或文字与图标结合的形式来展示,主要运用在顶部加号补充、复制、分享转发等场景。
② 导航筛选浮层
特点:所谓导航筛选,自然是与导航分不开的,再加上浮层是比较强调归属的,所以它通常会与导航连在一起,一般出现在顶部。
③ 引导浮层
特点:引导浮层的作用就是引导用户更好的使用产品及交互,降低用户的学习成本。它通常会出现在用户首次进入APP的时候,一般只会出现一次,点击空白位置或我知道了浮层就会消失。
二、非模态弹窗
Toast/Hud 提示框
Hud是ios的控件名词,Toast是安卓的控件名词,它们都属于一种轻提示,给予用户及时反馈,让用户知道自己当前所处的状态。
Hud一般只出现在屏幕的中央,以毛玻璃的样式表现,内容展示比较富丰富。
Toast可以出现在屏幕任意位置,通常以黑色半透明的小框来表现,内容一般是纯文字提示或者文字与图标结合提示。
① 状态提示
特点:状态提示的Toast,它们一般都是反馈用户当前操作的状态,只出现1到2秒就会自动消失,场景一般是关注成功、密码错误、音量提示、静音、清除缓存等。
② 按键提示
特点:按键Toast提示与状态提示不同,它们一般自动出现或者点击触发才会出现,用于对功能点的补充说明,让用户对功能有更深的了解。
Snackbar
Snackbar是Android中的一个控件。它一般会在超时自动关闭或者在屏幕上滑动关闭,它没有Toast那么轻量,设置出现的时间会比Toast长,而且可以点击按钮进行交互。
Tips提示
Tips与Snackbar最主要的区别就是:Tips它是内嵌在页面上的,而Snackbar则是浮在页面上的。Tips一般要让用户主动触发关闭按钮或点击进入下级页面才会消失,一般用于需要用户感知到的通知信息,或者植入广告。
规范总结
目前的弹窗样式非常多,你能想到的,你想不到的基本都可以技术实现。但这同时也带来一个问题,那就是“不规范”。以上提到的弹窗种类,你只需要选择符合你产品要求的几个类型,最好不要在一个产品中运用多个同种类型的弹窗,否则后期会很难规范及组件化,当然运营广告类弹窗可以另当别论。
差不多就写完了...大家觉得有帮助的话,记得点在看和转发~
D. android怎样自定义dialog
Android开发过程中,常常会遇到一些需求场景——在界面上弹出一个弹框,对用户进行提醒并让用户进行某些选择性的操作,
如退出登录时的弹窗,让用户选择“退出”还是“取消”等操作。
Android系统提供了Dialog类,以及Dialog的子类,常见如AlertDialog来实现此类功能。
一般情况下,利用Android提供的Dialog及其子类能够满足多数此类需求,然而,其不足之处体现在:
1. 基于Android提供的Dialog及其子类样式单一,风格上与App本身风格可能不太协调;
2. Dialog弹窗在布局和功能上有所限制,有时不一定能满足实际的业务需求。
本文将通过在Dialog基础上构建自定义的Dialog弹窗,以最常见的确认弹框为例。
本样式相对比较简单:上面有一个弹框标题(提示语),下面左右分别是“确认”和“取消”按钮,当用户点击“确认”按钮时,弹框执行
相应的确认逻辑,当点击“取消”按钮时,执行相应的取消逻辑。
首先,自定义弹框样式:
1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="match_parent"
4 android:layout_height="wrap_content"
5 android:background="@drawable/dialog_bg"
6 android:orientation="vertical" >
7
8 <TextView
9 android:id="@+id/title"
10 android:layout_width="wrap_content"
11 android:layout_height="wrap_content"
12 android:layout_gravity="center"
13 android:paddingTop="14dp"
14 android:textColor="@color/login_hint"
15 android:textSize="@dimen/text_size_18" />
16
17 <LinearLayout
18 android:layout_width="match_parent"
19 android:layout_height="wrap_content"
20 android:layout_marginBottom="14dp"
21 android:layout_marginLeft="20dp"
22 android:layout_marginRight="20dp"
23 android:layout_marginTop="30dp" >
24
25 <TextView
26 android:id="@+id/confirm"
27 android:layout_width="wrap_content"
28 android:layout_height="wrap_content"
29 android:layout_marginRight="10dp"
30 android:layout_weight="1"
31 android:background="@drawable/btn_confirm_selector"
32 android:gravity="center"
33 android:textColor="@color/white"
34 android:textSize="@dimen/text_size_16" />
35
36 <TextView
37 android:id="@+id/cancel"
38 android:layout_width="wrap_content"
39 android:layout_height="wrap_content"
40 android:layout_marginLeft="10dp"
41 android:layout_weight="1"
42 android:background="@drawable/btn_cancel_selector"
43 android:gravity="center"
44 android:textColor="@color/login_hint"
45 android:textSize="@dimen/text_size_16" />
46 </LinearLayout>
47
48 </LinearLayout>
然后,通过继承Dialog类构建确认弹框控件ConfirmDialog:
1 package com.corn.widget;
2
3 import android.app.Dialog;
4 import android.content.Context;
5 import android.os.Bundle;
6 import android.util.DisplayMetrics;
7 import android.view.LayoutInflater;
8 import android.view.View;
9 import android.view.Window;
10 import android.view.WindowManager;
11 import android.widget.TextView;
12
13 import com.corn.R;
14
15 public class ConfirmDialog extends Dialog {
16
17 private Context context;
18 private String title;
19 private String confirmButtonText;
20 private String cacelButtonText;
21 private ClickListenerInterface clickListenerInterface;
22
23 public interface ClickListenerInterface {
24
25 public void doConfirm();
26
27 public void doCancel();
28 }
29
30 public ConfirmDialog(Context context, String title, String confirmButtonText, String cacelButtonText) {
31 super(context, R.style.MyDialog);
32 this.context = context;
33 this.title = title;
34 this.confirmButtonText = confirmButtonText;
35 this.cacelButtonText = cacelButtonText;
36 }
37
38 @Override
39 protected void onCreate(Bundle savedInstanceState) {
40 // TODO Auto-generated method stub
41 super.onCreate(savedInstanceState);
42
43 init();
44 }
45
46 public void init() {
47 LayoutInflater inflater = LayoutInflater.from(context);
48 View view = inflater.inflate(R.layout.confirm_dialog, null);
49 setContentView(view);
50
51 TextView tvTitle = (TextView) view.findViewById(R.id.title);
52 TextView tvConfirm = (TextView) view.findViewById(R.id.confirm);
53 TextView tvCancel = (TextView) view.findViewById(R.id.cancel);
54
55 tvTitle.setText(title);
56 tvConfirm.setText(confirmButtonText);
57 tvCancel.setText(cacelButtonText);
58
59 tvConfirm.setOnClickListener(new clickListener());
60 tvCancel.setOnClickListener(new clickListener());
61
62 Window dialogWindow = getWindow();
63 WindowManager.LayoutParams lp = dialogWindow.getAttributes();
64 DisplayMetrics d = context.getResources().getDisplayMetrics(); // 获取屏幕宽、高用
65 lp.width = (int) (d.widthPixels * 0.8); // 高度设置为屏幕的0.6
66 dialogWindow.setAttributes(lp);
67 }
68
69 public void setClicklistener(ClickListenerInterface clickListenerInterface) {
70 this.clickListenerInterface = clickListenerInterface;
71 }
72
73 private class clickListener implements View.OnClickListener {
74 @Override
75 public void onClick(View v) {
76 // TODO Auto-generated method stub
77 int id = v.getId();
78 switch (id) {
79 case R.id.confirm:
80 clickListenerInterface.doConfirm();
81 break;
82 case R.id.cancel:
83 clickListenerInterface.doCancel();
84 break;
85 }
86 }
87
88 };
89
90 }
在如上空间构造代码中,由于控件的"确认"和"取消"逻辑与实际的应用场景有关,因此,控件中通过定义内部接口来实现。
在需要使用此控件的地方,进行如下形式调用:
1 public static void Exit(final Context context) {
2 final ConfirmDialog confirmDialog = new ConfirmDialog(context, "确定要退出吗?", "退出", "取消");
3 confirmDialog.show();
4 confirmDialog.setClicklistener(new ConfirmDialog.ClickListenerInterface() {
5 @Override
6 public void doConfirm() {
7 // TODO Auto-generated method stub
8 confirmDialog.dismiss();
9 //toUserHome(context);
10 AppManager.getAppManager().AppExit(context);
11 }
12
13 @Override
14 public void doCancel() {
15 // TODO Auto-generated method stub
16 confirmDialog.dismiss();
17 }
18 });
19 }
调用中实现了此控件的内部接口,并赋给控件本身,以此在点击按钮时实现基于外部具体业务逻辑的函数回调。