Pro Android学习笔记(一三七):Home Screen Widgets(3):配置Activity
文章转载仅仅能用于非商业性质,且不能带有虚拟货币、积分、注冊等附加条件。转载须注明出处http://blog.csdn.net/flowingflying/以及作者@恺风Wei。
通过widget定义。我们在widget列表中看到了我们的TestWidget。当我们拖拽widget到主页时。假设在appwidet-provider中定义了android:configure的java类,在widget实例创建后会立即唤起配置activity。这个activity主要完毕两个任务:1、配置初始化数据;2、将配置数据适配到widget实例中。
利用preference中存贮配置数据
widget数据能够保持在文件、Share preference,或者SQLite3中。
widget作为小工具配置数据量小,通常能够方便地存贮在preference中。
preference中数据存贮和读取使用BirthDayStoreData类来处理。
我们在Pro
Android学习笔记(六三):Preferences(7):代码控制首选项中的“利用preference保存状态”已经介绍过怎样实现,在此,复习一下。
我们须要存贮的内容有widgetID。名字。生日,Preference是以键值对的方式保存,我们以name_widgetID作为key。生日作为value来进行信息存贮。
public class BirthDayStoreData {
private final static String BIRTHDAY_WIDGET_PROVIDER_NAME = "cn.wei.flowingflying.testwidget.provider";
//保存配置数据:创建widget实例,通过configure activity进行配置时,保存相关配置数据
public static void storeData(Context context,int widgetId, String name,String value){
String key = getKey(widgetId,name);
//第一个參数是preferences文件,假设不存在则创建之。详细为/data/data/cn.wei.flowingflying.testwidget/shared_prefs/cn.wei.flowingflying.testwidget.provider.xml,能够在DDMS中查看。
Editor editor = context.getSharedPreferences(BIRTHDAY_WIDGET_PROVIDER_NAME, Context.MODE_PRIVATE).edit();
editor.putString(key, value);
editor.commit();
}
//删除配置数据:删除widget实例的同一时候。须要删除该实例的相关数据
public static void removeData(Context context, int widgetId){
String key = getKeyById(context, widgetId);
if(key == null)
return;
Editor editor = context.getSharedPreferences(BIRTHDAY_WIDGET_PROVIDER_NAME, Context.MODE_PRIVATE).edit();
editor.remove(key);
editor.commit();
}
//清空所有的配置数据
public static void removeAllData(Context context){
Editor editor = context.getSharedPreferences(BIRTHDAY_WIDGET_PROVIDER_NAME, Context.MODE_PRIVATE).edit();
editor.clear();
editor.commit();
}
//显示配置数据:用于我们在LogCat中进行跟踪,在此。我们也演示了怎样通过轮询方式。显示所有的数据,通过类似的方式,我们能够同widgetId查得相应的名字和生日,通过类似的方法,可依据widgetId查询key。名字,生日。相关代码从略。
public static void showData(Context context){
SharedPreferences prefs = context.getSharedPreferences(BIRTHDAY_WIDGET_PROVIDER_NAME, Context.MODE_PRIVATE);
Map<String,?
> pairs = prefs.getAll();
Log.d("DATA","Total " + pairs.size() + " widgets:");
for(String key:pairs.keySet()){
String value = (String)pairs.get(key);
Log.d("DATA",key + " - " + value);
}
}
public static String getNameById(Context context, int widgetId){
… …
}
public static String getDateById(Context context ,int widgetId){
… …
}
private static String getKey(int widgetId, String name){
return name + "_" + widgetId;
}
private static String getKeyById(Context context,int widgetId){
… …
}
}
配置初始化数据
配置configure activity的代码例如以下:
public class ConfigBirthDayWidgetActivity extends Activity{
private static String tag = "ConfigActivity";
private int myWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
@Override //配置activity的操作和普通activity的一样。但在被AppWidgetManage唤起时,intent是携带widgetId的信息。我们在onCreate()中获取Widget ID。
protected void onCreate(Bundle savedInstanceState) {
… …
Intent intent = getIntent();
Bundle b = intent.getExtras();
if(b != null){
myWidgetId = b.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,AppWidgetManager.INVALID_APPWIDGET_ID);
}
if(myWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID){
Toast.makeText(this, "Widget Error : 无有效widget ID", Toast.LENGTH_LONG).show();
finish();
}
}
.. ….
//点击配置button后调用的方法
private void getAndStoreConfigInfo(){
… … String name为用户输入名字,String date为用户输入的有效日期
//【1】在preference中保持数据,并显示全部数据
BirthDayStoreData.storeData(this, myWidgetId, name, date);
BirthDayStoreData.showData(this);
//【2】将配置数据与详细的widget实例相关联,详细实现见后面
BirthDayStoreData.updateAppWidget(this, myWidgetId,name, date);
//【3】将结果返回给AppWidget Manager。以通知它Configurator已经完毕。
作用如同startActivityForResult()给出返回值。通知AppWidgetManager某个widgetId已经完毕配置,能够在主页上显示创建的widget实例
Intent resultIntent = new Intent();
resultIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, myWidgetId);
setResult(RESULT_OK, resultIntent);
//【4】关闭activity
finish();
}
}
配置数据适配到widget实例中
Widget实例的view要通过RemoteViews进行控制,小样例採用静态方法的方式。代码片段例如以下:
public class BirthDayStoreData {
... ...
public static void updateAppWidget(Context context,int widgetId,String name, String date){
//【1】设置Remote view的信息
// 1.1)、获得remote view对象
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.birday_widget);
// 1.2)、对remote view进行setText()设置
views.setTextViewText(R.id.bd_name, widgetId + ":" + name);
views.setTextViewText(R.id.bd_date, date);
views.setTextViewText(R.id.bd_days, Long.toString(Utils.howFarInDays(Utils.getDate(date))));//Utils是处理日期的类
// 1.3)、通过PendingIntent设置某个view的点击处理,採用intent方式,能够打开activity,service。receiver等等。
本小样例将打开某个网页
Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.taobao.com"));
PendingIntent pi = PendingIntent.getActivity(context, 0, intent, 0);
views.setOnClickPendingIntent(R.id.bd_buy, pi);
//【2】通过AppWidgetManger,详细实施到widgetId实例上。
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
appWidgetManager.updateAppWidget(widgetId,views);
}
public static void updateAppWidget(Context context,int widgetId){
… …
}
}
小样例代码在:Pro Android学习:widget小样例
相关链接:我的Android开发相关文章
Pro Android学习笔记(一三七):Home Screen Widgets(3):配置Activity的更多相关文章
- 【转】 Pro Android学习笔记(三七):Fragment(2):基础小例子
目录(?)[-] 小例子运行效果 Pre-step一点准备 Step 1Activity的布局 小例子运行效果 这是一个书名和书简介的例子.运行如下图.Activity由左右两个Fragment组成, ...
- Pro Android学习笔记 ActionBar(1):Home图标区
Pro Android学习笔记(四八):ActionBar(1):Home图标区 2013年03月10日 ⁄ 综合 ⁄ 共 3256字 ⁄ 字号 小 中 大 ⁄ 评论关闭 ActionBar在A ...
- 【转】 Pro Android学习笔记(八二):了解Package(1):包和进程
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在之前,我们已经学习了如何签发apk,见P ...
- 【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET
目录(?)[-] HTTP GET小例子 简单小例子 出现异常NetworkOnMainThreadException 通过StrictMode进行处理 URL带键值对 Andriod应用可利用ser ...
- 【转】 Pro Android学习笔记(五五):调试和分析(3):adb命令、模拟器控制台和StrictMode
目录(?)[-] adb命令 模拟器Console StrictMode adb命令 我们在学习SQLite的使用,介绍过部分adb命令的使用,见Pro Android学习笔记(五):了解Conten ...
- 【转】 Pro Android学习笔记(五六):配置变化
目录(?)[-] Activity的destorycreate过程 Fragment的destorycreate过程 onSaveInstanceState saveFragmentInstanceS ...
- 【转】 Pro Android学习笔记(五二):ActionBar(5):list模式
可以在action bar中加入spinner的下来菜单,有关spinner,可以参考Pro Android学习笔记(二十):用户界面和控制(8):GridView和Spinner. list的样式和 ...
- 【转】 Pro Android学习笔记(四二):Fragment(7):切换效果
目录(?)[-] 利用setTransition 利用setCustomAnimations 通过ObjectAnimator自定义动态效果 程序代码的编写 利用fragment transactio ...
- 【转】 Pro Android学习笔记(四十):Fragment(5):适应不同屏幕或排版
目录(?)[-] 设置横排和竖排的不同排版风格 改写代码 对于fragment,经常涉及不同屏幕尺寸和不同的排版风格.我们在基础小例子上做一下改动,在横排的时候,仍是现实左右两个fragment,在竖 ...
随机推荐
- KVO And KVC
http://www.cocoachina.com/industry/20140224/7866.html
- Leetcode25--->Reverse Nodes in k-Group(以k个节点为段,反转单链表)
题目: 给定一个单链表,一次反转k个节点,最终返回翻转后的链表的头节点:如果链表不足k个,则不变 举例: Given this linked list: 1->2->3->4-> ...
- 零基础学习 Python 之数字与运算
写在之前 大家好,这里是零基础学习 Python 系列,在这里我将从最基本的 Python 写起,然后再慢慢涉及到高阶以及具体应用方面.我是完全自学的 Python,所以很是明白自学对于一个人的考验, ...
- GloVe词分布式表示
GloVe 模型介绍 下面的内容主要来自https://blog.csdn.net/u014665013/article/details/79642083 GloVe的推导 GloVe是基于共现信息来 ...
- Apache Log4j 2 is Coming
刚刚从同事那里得知,log4j 2 出beta版本了. 有啥提升呢? Improved PerformanceLog4j 2 contains next-generation Asynchronous ...
- 【bzoj2338】[HNOI2011]数矩形 计算几何
题目描述 题解 计算几何 由于对角线平分且相等的四边形是矩形,因此我们可以把每条对角线存起来,按照对角线长度和中点位置为关键字排序,这样对于每个相同长度和中点的对角线就排到了一起. 于是对于每段可能形 ...
- Educational Codeforces Round 11——A. Co-prime Array(map+vector)
A. Co-prime Array time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- babel吐槽
1. .babelrc文件无法复制 每次复制项目文件,.babelrc文件都会丢失,导致项目的ES6莫名的编译失败,最可能出现的错误就是Unexpected token import错误,import ...
- 刷题总结——小c找朋友(bzoj4264 集合hash)
题目: Description 幼儿园里有N个小C,两个小C之间可能是朋友也可能不是.所有小C之间的朋友关系构成了一个无向图,这个无向图中有M条边. 园长ATM发现对于两个(不同的)小Ci和j,如果其 ...
- leetcode 20 简单括号匹配
栈的运用 class Solution { public: bool isValid(string s) { stack<char>The_Stack; ; The_Stack.push( ...