文章转载仅仅能用于非商业性质,且不能带有虚拟货币、积分、注冊等附加条件。转载须注明出处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的更多相关文章

  1. 【转】 Pro Android学习笔记(三七):Fragment(2):基础小例子

    目录(?)[-] 小例子运行效果 Pre-step一点准备 Step 1Activity的布局 小例子运行效果 这是一个书名和书简介的例子.运行如下图.Activity由左右两个Fragment组成, ...

  2. Pro Android学习笔记 ActionBar(1):Home图标区

     Pro Android学习笔记(四八):ActionBar(1):Home图标区 2013年03月10日 ⁄ 综合 ⁄ 共 3256字 ⁄ 字号 小 中 大 ⁄ 评论关闭 ActionBar在A ...

  3. 【转】 Pro Android学习笔记(八二):了解Package(1):包和进程

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在之前,我们已经学习了如何签发apk,见P ...

  4. 【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET

    目录(?)[-] HTTP GET小例子 简单小例子 出现异常NetworkOnMainThreadException 通过StrictMode进行处理 URL带键值对 Andriod应用可利用ser ...

  5. 【转】 Pro Android学习笔记(五五):调试和分析(3):adb命令、模拟器控制台和StrictMode

    目录(?)[-] adb命令 模拟器Console StrictMode adb命令 我们在学习SQLite的使用,介绍过部分adb命令的使用,见Pro Android学习笔记(五):了解Conten ...

  6. 【转】 Pro Android学习笔记(五六):配置变化

    目录(?)[-] Activity的destorycreate过程 Fragment的destorycreate过程 onSaveInstanceState saveFragmentInstanceS ...

  7. 【转】 Pro Android学习笔记(五二):ActionBar(5):list模式

    可以在action bar中加入spinner的下来菜单,有关spinner,可以参考Pro Android学习笔记(二十):用户界面和控制(8):GridView和Spinner. list的样式和 ...

  8. 【转】 Pro Android学习笔记(四二):Fragment(7):切换效果

    目录(?)[-] 利用setTransition 利用setCustomAnimations 通过ObjectAnimator自定义动态效果 程序代码的编写 利用fragment transactio ...

  9. 【转】 Pro Android学习笔记(四十):Fragment(5):适应不同屏幕或排版

    目录(?)[-] 设置横排和竖排的不同排版风格 改写代码 对于fragment,经常涉及不同屏幕尺寸和不同的排版风格.我们在基础小例子上做一下改动,在横排的时候,仍是现实左右两个fragment,在竖 ...

随机推荐

  1. ThreeJs 3D 全景项目开发总结

    本文来自网易云社区 作者:唐钊 项目背景 那是在一个毫无征兆的下午,我还沉浸在 vue 的世界中,突然编辑跑过来说N的新官网想做一些3D全景的东西,一开始其实我的内心是拒绝的,一是没怎么实质性做过 W ...

  2. webdriver高级应用- 浏览器中新开标签页(Tab)

    #encoding=utf-8 import unittest from selenium import webdriver import time import win32api, win32con ...

  3. 简述 yield和yield from关键字

    1.可迭代对象与迭代器的区别 可迭代对象:指的是具备可迭代的能力,即enumerable.  在Python中指的是可以通过for-in 语句去逐个访问元素的一些对象,比如元组tuple,列表list ...

  4. python 学习分享-字典篇

    python字典(Dictionary) dict是无序的 key必须是唯一切不可变的 a={'key1':'value1','key2':'value2'} 字典的增删改查 a['key3']='v ...

  5. P1023 税收与补贴问题 (模拟)

    题目链接 Solution 比较恶心的模拟题(主要是难看懂题意其实) 题意戳这里 然后根据一些简单的数学常识,可以知道这是一个二次函数. 所以我们每次枚举一个值,然后判定政府给出的价格是否是顶点即可. ...

  6. java面试题之谈谈你对java的理解

    平台无关性:一处编译到处运行 GC:不用像c++那样手动释放堆内容 语言特性:泛型.反射.lamda表达式 面向对象:封装.继承.多态 类库:集合.并发库.网络库.IO库 异常处理

  7. Mondriaan's Dream(poj 2411)

    题意:在n*m的方格里铺1*2的骨牌,有多少种方案 /* 第一次做插头DP,感觉和状压差不多. 这道题是利用上一行的状态来更新下一行的状态. 1代表上一行这个位置填了一个竖的(即本行可以填): 0代表 ...

  8. Milk Patterns(poj 3261)

    题意:找出出现k次的可重叠的最长子串的长度. /* 求出height数组,二分答案,将height分组,看有没有一组个数大于K. WA了很多遍,最后看别人的题解,发现往字符串后面填了一个0,就可以AC ...

  9. freemarker实现自定义指令和自定义函数

    自定义指令: 1.指令在前台实现 <#macro name param1,param2,param3...paramN> </#macro> 2.指令在后台实现 1.实现Tem ...

  10. 【HDOJ6218】Bridge(线段树,set,网格图,连通性)

    题意:给定一张2×n的网格图,一开始矩阵所有相邻点之间有一条边 有q个询问,每次给出两个相邻的点的坐标,将其中的边删除或者添加,问如此操作之后整张图的割边数量     n,q<=2*10^5, ...