10. Android框架之 AppMsg(消息提示)

1. AppMsg

  优雅的弹出类似Toast的消息提示,支持3种状态Alert(警告),Confirm(确认)以及Info(消息)。

      

2. AppMsg使用:

(1)AppMsg下载地址:

https://github.com/johnkil/Android-AppMsg

(2)下载成功之后,解压如下:

(3)导入library 和 sample 分别导入Eclipse如下:

(4)首先我们来到主布局文件activity_main.xml,如下:

 1 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:fillViewport="true">
 6
 7     <LinearLayout
 8         android:id="@+id/animated_root"
 9         android:layout_width="match_parent"
10         android:layout_height="match_parent"
11         android:gravity="center"
12         android:orientation="vertical"
13         android:animateLayoutChanges="true"
14         android:padding="48dp">
15
16         <TextView
17             android:layout_width="wrap_content"
18             android:layout_height="wrap_content"
19             android:layout_gravity="left"
20             android:textAllCaps="true"
21             android:text="@string/style"
22             />
23         <Spinner
24             android:id="@+id/style_spnr"
25             android:layout_width="match_parent"
26             android:layout_height="wrap_content"
27             android:minHeight="48dp"
28             android:spinnerMode="dropdown"
29             android:entries="@array/styles"
30             android:prompt="@string/style"
31             />
32         <TextView
33             android:layout_width="wrap_content"
34             android:layout_height="wrap_content"
35             android:layout_gravity="left"
36             android:textAllCaps="true"
37             android:text="@string/priority"
38             />
39         <Spinner
40             android:id="@+id/priority_spnr"
41             android:layout_width="match_parent"
42             android:layout_height="wrap_content"
43             android:minHeight="48dp"
44             android:spinnerMode="dropdown"
45             android:entries="@array/priorities"
46             android:prompt="@string/priority"
47             />
48
49         <CheckBox
50             android:id="@+id/bottom"
51             android:layout_width="match_parent"
52             android:layout_height="wrap_content"
53             android:text="@string/bottom" />
54
55         <LinearLayout
56             android:id="@+id/alt_parent"
57             android:visibility="gone"
58             android:layout_width="match_parent"
59             android:layout_height="wrap_content"
60             android:minHeight="48dp"
61             android:orientation="vertical" />
62
63         <CheckBox
64             android:id="@+id/parent_chk"
65             android:layout_width="match_parent"
66             android:layout_height="wrap_content"
67             android:text="@string/custom_parent" />
68
69         <EditText
70             android:id="@+id/provided_txt"
71             android:layout_width="match_parent"
72             android:layout_height="wrap_content"
73             android:hint="@string/your_message_here"
74             />
75
76         <Button
77             android:id="@+id/show"
78             android:layout_width="match_parent"
79             android:layout_height="wrap_content"
80             android:onClick="buttonClick"
81             android:text="@string/show_appmsg" />
82
83         <Button
84             android:id="@+id/cancel_all"
85             android:layout_width="match_parent"
86             android:layout_height="wrap_content"
87             android:onClick="buttonClick"
88             android:text="@string/cancel_all" />
89
90     </LinearLayout>
91 </ScrollView>

布局效果如下:

前面提到可以显示Alert、Confirm、Info三种消息样式,其实还可以显示自定义的消息样式,这里我们自定义一个消息样式为sticky.xml,如下:

 1 <?xml version="1.0" encoding="utf-8"?>
 2
 3 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 4                 android:layout_width="match_parent"
 5                 android:layout_height="wrap_content"
 6                 android:minHeight="48dp">
 7
 8     <ImageButton
 9             android:id="@+id/remove_btn"
10             android:layout_width="wrap_content"
11             android:layout_height="wrap_content"
12             android:layout_alignParentRight="true"
13             android:layout_centerVertical="true"
14             android:minWidth="48dp"
15             android:minHeight="48dp"
16             android:src="@drawable/ic_action_cancel_inset"
17             style="@style/SelectableItem"/>
18
19
20     <TextView
21             android:id="@android:id/message"
22             android:layout_width="match_parent"
23             android:layout_height="wrap_content"
24             android:layout_toLeftOf="@id/remove_btn"
25             android:layout_centerVertical="true"
26             android:gravity="center"
27             android:padding="8dp"
28             android:textColor="#ff222222"
29             android:textIsSelectable="false"
30             android:textSize="14sp"
31             android:textStyle="bold"/>
32
33 </RelativeLayout>

布局效果图,如下:

(5)在MainActivity工程之中找到主Activity,修改为extends Activity,如下:

  1 /*
  2  * Copyright 2012 Evgeny Shishkin
  3  *
  4  * Licensed under the Apache License, Version 2.0 (the "License");
  5  * you may not use this file except in compliance with the License.
  6  * You may obtain a copy of the License at
  7  *
  8  *      http://www.apache.org/licenses/LICENSE-2.0
  9  *
 10  * Unless required by applicable law or agreed to in writing, software
 11  * distributed under the License is distributed on an "AS IS" BASIS,
 12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 13  * See the License for the specific language governing permissions and
 14  * limitations under the License.
 15  */
 16
 17 package com.devspark.appmsg.sample;
 18
 19 import android.app.Activity;
 20 import android.animation.LayoutTransition;
 21 import android.annotation.TargetApi;
 22 import android.os.Bundle;
 23 import android.view.View;
 24 import android.view.ViewGroup;
 25 import android.widget.CheckBox;
 26 import android.widget.CompoundButton;
 27 import android.widget.EditText;
 28 import android.widget.Spinner;
 29
 30
 31
 32 import static android.os.Build.VERSION.SDK_INT;
 33 import static android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH;
 34 import static android.os.Build.VERSION_CODES.JELLY_BEAN;
 35 import static android.text.TextUtils.isEmpty;
 36 import static android.view.Gravity.BOTTOM;
 37 import static android.view.View.GONE;
 38 import static android.view.View.VISIBLE;
 39
 40 import com.devspark.appmsg.AppMsg;
 41
 42 /**
 43  * Sample of AppMsg library.
 44  *
 45  * @author hebao
 46  */
 47 public class  MainActivity  extends Activity {
 48     private static final int NORMAL_POSITION = 1;
 49     private static final int INFO_POSITION = 2;
 50
 51     private int mMsgCount;
 52     private Spinner mStyle;
 53     private Spinner mPriority;
 54     private EditText mProvidedMsg;
 55     private CheckBox mBottom;
 56     private CheckBox mParent;
 57     private ViewGroup mAltParent;
 58
 59     public void onCreate(Bundle savedInstanceState) {
 60         super.onCreate(savedInstanceState);
 61         setContentView(R.layout.activity_main);
 62
 63         mProvidedMsg = (EditText) findViewById(R.id.provided_txt);
 64         mStyle = (Spinner) findViewById(R.id.style_spnr);
 65         mStyle.setSelection(INFO_POSITION);
 66         mPriority = (Spinner) findViewById(R.id.priority_spnr);
 67         mPriority.setSelection(NORMAL_POSITION);
 68         mBottom = (CheckBox) findViewById(R.id.bottom);
 69         mParent = (CheckBox) findViewById(R.id.parent_chk);
 70         mAltParent = (ViewGroup) findViewById(R.id.alt_parent);
 71
 72         mParent.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
 73             @Override
 74             public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
 75                 mAltParent.setVisibility(isChecked ? VISIBLE : GONE);
 76                 mBottom.setVisibility(isChecked ? GONE : VISIBLE);
 77             }
 78         });
 79
 80         if (SDK_INT >= JELLY_BEAN) {
 81             enableChangingTransition();
 82         }
 83     }
 84
 85     /**
 86      * 指使用该注解的方法适用于系统版本Android 4.1
 87      * 注:Android 4.1的版本代号是Jelly Bean
 88      */
 89     @TargetApi(JELLY_BEAN)
 90     private void enableChangingTransition() {
 91         ViewGroup animatedRoot = (ViewGroup) findViewById(R.id.animated_root);
 92         animatedRoot.getLayoutTransition().enableTransitionType(LayoutTransition.CHANGING);
 93     }
 94
 95     /**
 96      * Button onClick listener.
 97      *
 98      * @param v
 99      */
100     public void buttonClick(View v) {
101         switch (v.getId()) {
102             case R.id.show:
103                 showAppMsg();
104                 break;
105             case R.id.cancel_all:
106                 AppMsg.cancelAll(this);
107                 break;
108             default:
109                 return;
110         }
111     }
112
113     /**
114      * 显示App Message
115      */
116     private void showAppMsg() {
117         mMsgCount++;
118         final int styleSelected = mStyle.getSelectedItemPosition();
119         final int priority = positionToPriority(mPriority.getSelectedItemPosition());
120         final CharSequence providedMsg = mProvidedMsg.getText();
121         final CharSequence msg = isEmpty(providedMsg)
122                 ? new StringBuilder().append(mStyle.getSelectedItem())
123                 .append(" ").append(mPriority.getSelectedItem())
124                 .append(" msg#").append(mMsgCount).toString()
125                 : providedMsg;
126         final AppMsg.Style style;
127         boolean customAnimations = false;
128         AppMsg provided = null;
129         switch (styleSelected) {
130             case 0:
131                 style = AppMsg.STYLE_ALERT;
132                 break;
133             case 1:
134                 style = AppMsg.STYLE_CONFIRM;
135                 break;
136             case 3:
137                 style = new AppMsg.Style(AppMsg.LENGTH_SHORT, R.color.custom);
138                 customAnimations = true;
139                 break;
140             case 4:
141                 style = new AppMsg.Style(AppMsg.LENGTH_STICKY, R.color.sticky);
142                 provided = AppMsg.makeText(this, msg, style, R.layout.sticky);
143                 provided.getView()
144                         .findViewById(R.id.remove_btn)
145                         .setOnClickListener(new CancelAppMsg(provided));
146                 break;
147             default:
148                 style = AppMsg.STYLE_INFO;
149                 break;
150         }
151         // create {@link AppMsg} with specify type
152         AppMsg appMsg = provided != null ? provided : AppMsg.makeText(this, msg, style);
153         appMsg.setPriority(priority);
154         if (mParent.isChecked()) {
155             appMsg.setParent(mAltParent);
156         } else {
157             if (mBottom.isChecked()) {
158                 appMsg.setLayoutGravity(BOTTOM);
159             }
160         }
161
162         if (customAnimations) {
163             appMsg.setAnimation(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
164         }
165         appMsg.show();
166
167     }
168
169     private static int positionToPriority(int selectedItemPosition) {
170         switch (selectedItemPosition) {
171             case 0:
172                 return AppMsg.PRIORITY_HIGH;
173             case 2:
174                 return AppMsg.PRIORITY_LOW;
175             default:
176                 return AppMsg.PRIORITY_NORMAL;
177         }
178     }
179
180     @Override
181     protected void onPause() {
182         super.onPause();
183         // This is optional for 14+,
184         // also you may want to call it at your later convenience, e.g. onDestroy
185         if (SDK_INT < ICE_CREAM_SANDWICH) {
186             AppMsg.cancelAll(this);
187         }
188     }
189
190     static class CancelAppMsg implements View.OnClickListener {
191         private final AppMsg mAppMsg;
192
193         CancelAppMsg(AppMsg appMsg) {
194             mAppMsg = appMsg;
195         }
196
197         @Override
198         public void onClick(View v) {
199             mAppMsg.cancel();
200         }
201     }
202 }

部署到模拟器上,如下:

时间: 2024-11-01 00:07:22

10. Android框架之 AppMsg(消息提示)的相关文章

Android:Toast简单消息提示框

Toast是简单的消息提示框,一定时间后自动消失,没有焦点. 1.简单文本提示的方法: //参数1:当前的上下文环境.this或getApplicationContext() //参数2:提示内容 //参数3:显示的时间长短 Toast toast = Toast.makeText(this, "默认的toast", Toast.LENGTH_LONG); toast.show(); 2.自定义位置的方法: Toast toast = Toast.makeText(this, &quo

Android消息提示:AlertDialog、Toast、Notification的使用

主要介绍Android常用于消息提示的组件:ALertDialog.Toast.Notification的使用场景以及它们的基本用法,探讨一些高级主题,最后总结一些开发过程中常见的问题. 首先我们来对这三种消息提示机制来一个直观的认识,分别是AlertDialog Toast.Notification 接下来分别介绍这三种机制各自对应的使用场景和用法 AlertDialog 使用场景:AlertDialog在应用内的使用还是很常见的,常用于让用户做出某种选择,而这种选择一定是简单的交互,如果是复

android 消息提示机制

消息提示机制 一 对话框 Dialog AlertDialog 对话框有:标准对话框, 菜单式对话框, 菜单式复选框对话框,自定义对话框 (注意:这里的上下文公用了,代码的点击方法我已经在点击监听事件里注册了) 1 标准对话框: 在布局界面写好按钮,然后设置点击事件, 在事件种创建 dialog 的构造器 AlertDialog.Builder builder = new AlertDialog.Builder(context); 然后用构造器设置dialog的各种属性,最后create,sho

Android——AutoCompleteTextView、Spinner和消息提示

layout文件: 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" 4 android:layout_width="ma

Android安卓程序消息提示和按钮响应事件

首先在界面的XML里添加按钮响应函数 android:onClick="OnMyClick" <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/textView1" androi

Android消息提示框Toast

Toast是Android中一种简易的消息提示框.和Dialog不一样的是,Toast是没有焦点的,toast提示框不能被用户点击,而且Toast显示的时间有限,toast会根据用户设置的显示时间后自动消失. 创建Toast的方法总共有2种: 1.Toast.makeText(Context context, (CharSequence text)/( int resId), int duration) 参数:context是指上下文对象,通常是当前的Activity,text是指自己写的消息内

android自定义tabbar,并带badgeview消息提示

最早的时候,我用的tab都是在屏幕底端的,后来慢慢的流行在屏幕顶端了,按照用户体验来说,顶部确实比底部好,不仅可以防止按到返回键或者Home等引起误操作,而且tab标题在头顶很显眼很醒目. 一开始朋友推荐使用viewpageindicator,这个可以在github上有例子,大家如果没什么特殊需求,基本可以满足要求.根据项目要求我就使用了viewpageindicator,后来项目要求有消息提示,就像ios的badge一样,因此就对viewpageindicator进行修改,改了之后,就出现了下

View(视图)——AutoCompleteTextView 、Spinner和消息提示

一.AutoCompleteTextView 自动提示文本输入框 1.属性:不区分大小写. 2.ArrayAdapter  适配器 数据源是String[ ]或集合,保存要提示的文本:layout文件. 3.completionThreshold:设置提示需要的最少字符数,默认是2. 二.Spinner 下拉列表 1.ArrayAdapter  适配器 数据源是String[ ]或集合,保存要提示的文本:layout文件. 2.监听器   AdapterView.OnItemSelectedLi

Android学习之----Handler消息

Android系统规定,一些耗时的操作不能放在UI线程中去执行,这样会报一个ANR错误.所以为了避免该问题,我们需要开启一个新的线程去执行一些耗时操作:开启新的线程,将耗时的操作在新线程里面去执行, 但是子线程中不能更新UI界面,所以我们使用android的Handler机制可以解决这个问题.  详细解释如下: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发, 比如说, 你要是点击一个 Button ,Android会分发