AndroidWidget实践 --- EverydayTips开发(2)
继续昨天的话题
昨天实现的只是个死的widget widget除了显示信息的作用外还要和用户交互,这就是我们要做的事情:
如图(录制的不好啊) 美工什么的再说吧 呵呵
有点意思了吧?其实很简单
首先是在Widget里添加click事件:
package com.su.tipeveryday;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.provider.ContactsContract.CommonDataKinds.Note;
import android.util.Log;
import android.widget.RemoteViews;
import android.widget.TextView;
import android.widget.Toast;
public class TipEveryDayWidget extends AppWidgetProvider {
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
// TODO Auto-generated method stub
super.onDeleted(context, appWidgetIds);
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {// widget更新执行的方法
// TODO Auto-generated method stub
super.onUpdate(context, appWidgetManager, appWidgetIds);
// final int N = appWidgetIds.length;//实现单个widget更新的方法,暂时不用
// Log.d("app", "onUpdate--->Ids===" + String.valueOf(N));
// for (int i = 0; i < N; i++) {// 如果有很多同类widget是需要遍历的(他们的id是不同的)
// int appWidgetId = appWidgetIds[i];
// updateAppWidget(context, appWidgetManager, appWidgetId);//
// 更新widget的方法
// }
updateAppWidget(context, appWidgetManager, appWidgetIds);// 更新widget的方法
}
private void updateAppWidget(Context context,
AppWidgetManager appWidgetManager, int[] appWidgetIds) {
// 1.1,增加跳转用activity相关 intent
RemoteViews views = new RemoteViews(context.getPackageName(),
R.layout.widget_layout);
String tip = Tips.getTips();// 从Tips.java 获取警句
views.setTextViewText(R.id.textViewWidget, tip);// 设置
Intent intent = new Intent(context, TipEveryDayActivity.class);// 一下三句就可以启动Activity了
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
intent, 0);
views.setOnClickPendingIntent(R.id.textViewWidget, pendingIntent);
Intent intent2 = new Intent("com.su.ontipclick");// 这三句就可以注册按钮事件了,确实比较麻烦
PendingIntent pendingIntent2 = PendingIntent.getBroadcast(context, 0,
intent2, 0);
views.setOnClickPendingIntent(R.id.buttonChange, pendingIntent2);
appWidgetManager.updateAppWidget(appWidgetIds, views);// 把widget的内容更新
}
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("com.su.ontipclick")) {
Toast.makeText(context, "OK!!!!!", Toast.LENGTH_LONG).show();// 点击按钮会触发的事件
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
R.layout.widget_layout);// 只能通过远程对象来设置appwidget中的控件状态
String tip = Tips.getTips();// 从Tips.java 获取警句
remoteViews.setTextViewText(R.id.textViewWidget, tip);
AppWidgetManager appWidgetManager = AppWidgetManager
.getInstance(context);// 获得appwidget管理实例,用于管理appwidget以便进行更新操作
ComponentName componentName = new ComponentName(context,
TipEveryDayWidget.class);// 相当于获得所有本程序创建的appwidget
appWidgetManager.updateAppWidget(componentName, remoteViews);
}
super.onReceive(context, intent);
}
}
在widget中注册事件比较麻烦,其实还是实现一个隐式intent,所以要在Manifest中注册这个intent
<receiver android:name=".TipEveryDayWidget"
android:label="AAAAAAAATip">
<intent-filter >
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="com.su.ontipclick"></action><!-- 单击事件 -->
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_config" /><!-- 这个是widget的配置文件,出来这个之外其他的不用管直接copy -->
</receiver>
对了 对Tips.java做了小小的处理
package com.su.tipeveryday;
public class Tips {
public static Boolean flagBoolean =true;
public static String getTips() {
if (flagBoolean) {
flagBoolean = false;
return "宝剑锋从磨砺出,梅花香自苦寒来";
}
else {
flagBoolean=true;
return "咬定青山不放松,立根原在破岩中";
}
}
}
呵呵要是看不懂我没办法了