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 }
調用中實現了此控制項的內部介面,並賦給控制項本身,以此在點擊按鈕時實現基於外部具體業務邏輯的函數回調。