pro android学习笔记,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类来处理。

我们须要存贮的内容有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

> 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){

… …

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值