Java 小部件上的2个按钮-刷新和显示活动
我有两个按钮,一个是id刷新按钮,另一个是id详细信息按钮。第一个按钮应触发小部件更新,第二个按钮显示详细信息(小部件刷新后下载)。 这是天气小部件。应触发刷新以下载完整的天气数据。基本天气信息应直接显示在小部件上,详细活动的完整数据,在detailsInfo按钮上启动 这是我的代码:Java 小部件上的2个按钮-刷新和显示活动,java,android,android-activity,onclick,widget,Java,Android,Android Activity,Onclick,Widget,我有两个按钮,一个是id刷新按钮,另一个是id详细信息按钮。第一个按钮应触发小部件更新,第二个按钮显示详细信息(小部件刷新后下载)。 这是天气小部件。应触发刷新以下载完整的天气数据。基本天气信息应直接显示在小部件上,详细活动的完整数据,在detailsInfo按钮上启动 这是我的代码: public class AppWidget extends AppWidgetProvider { public static String ACTION_DETAILS = "m.m.meteowi
public class AppWidget extends AppWidgetProvider
{
public static String ACTION_DETAILS = "m.m.meteowidget.ACTION_DETAILS";
@Override
public void onReceive(Context context, Intent intent)
{
Log.i("onReceive",intent.getAction());
super.onReceive(context, intent);
}
@Override
public void onUpdate(Context ctxt, AppWidgetManager mgr, int[] appWidgetIds)
{
ComponentName me = new ComponentName(ctxt, AppWidget.class);
final RemoteViews updateViews = new RemoteViews(ctxt.getPackageName(), R.layout.widget_layout);
Intent intent = new Intent(ctxt, AppWidget.class);
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
PendingIntent pi = PendingIntent.getBroadcast(ctxt, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
updateViews.setOnClickPendingIntent(R.id.refresh, pi);
Intent intent2 = new Intent(ctxt, DetailsActivity.class);
intent2.setAction(ACTION_DETAILS);
PendingIntent di = PendingIntent.getActivity(ctxt, 0, intent2, 0);
updateViews.setOnClickPendingIntent(R.id.detailsInfo, di);
mgr.updateAppWidget(me, updateViews);
for (int i = 0; i < appWidgetIds.length; i++)
new WeatherInfo(updateViews,appWidgetIds[i],mgr).execute();
}
}
公共类AppWidget扩展了AppWidgetProvider
{
公共静态字符串ACTION\u DETAILS=“m.m.meteowidget.ACTION\u DETAILS”;
@凌驾
公共void onReceive(上下文、意图)
{
Log.i(“onReceive”,intent.getAction());
super.onReceive(上下文、意图);
}
@凌驾
public void onUpdate(上下文ctxt,AppWidgetManager mgr,int[]appWidgetIds)
{
ComponentName me=新组件名(ctxt,AppWidget.class);
final-RemoteViews-updateViews=新的远程视图(ctxt.getPackageName(),R.layout.widget\u布局);
意图=新意图(ctxt,AppWidget.class);
setAction(AppWidgetManager.ACTION\u APPWIDGET\u UPDATE);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_id,appWidgetIds);
PendingEvent pi=PendingEvent.getBroadcast(ctxt,0,intent,PendingEvent.FLAG_UPDATE_CURRENT);
setonClickPendingContent(R.id.refresh,pi);
Intent intent2=新的Intent(ctxt,DetailsActivity.class);
意图2.设置行动(行动详情);
pendingent di=pendingent.getActivity(ctxt,0,intent2,0);
updateViews.setonClickPendingContent(R.id.detailsInfo,di);
经理updateAppWidget(我,updateViews);
for(int i=0;i
WeatherInfo是实际执行天气详细信息下载的类(它扩展了AsyncTask)。如您所见,它将我的updateViews作为构造函数参数,然后设置小部件上显示的基本天气信息
但是,我不知道如何显示活动的详细信息并将详细的天气信息传递给它。当我尝试如上所示运行我的活动时,我的小部件无法加载(“加载小部件的问题”),没有任何我可以调试的异常
知道我做错了什么吗
[编辑]
这似乎(几乎)没问题:
小部件提供商:
@Override
public void onReceive(Context context, Intent intent)
{
Log.i("onReceive",intent.getAction());
super.onReceive(context, intent);
}
@Override
public void onUpdate(Context ctxt, AppWidgetManager mgr, int[] appWidgetIds)
{
ComponentName me = new ComponentName(ctxt, AppWidget.class);
final RemoteViews updateViews = new RemoteViews(ctxt.getPackageName(), R.layout.widget_layout);
Intent intent = new Intent(ctxt, AppWidget.class);
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
PendingIntent pi = PendingIntent.getBroadcast(ctxt, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
updateViews.setOnClickPendingIntent(R.id.refresh, pi);
mgr.updateAppWidget(me, updateViews);
Intent intent2 = new Intent(ctxt, DetailsActivity.class);
intent2.setAction(ACTION_DETAILS);
PendingIntent di = PendingIntent.getActivity(ctxt, 0, intent2, 0);
updateViews.setOnClickPendingIntent(R.id.detailsInfo, di);
mgr.updateAppWidget(me, updateViews);
for (int i = 0; i < appWidgetIds.length; i++)
new WeatherInfo(updateViews,appWidgetIds[i],mgr).execute();
}
@覆盖
公共void onReceive(上下文、意图)
{
Log.i(“onReceive”,intent.getAction());
super.onReceive(上下文、意图);
}
@凌驾
public void onUpdate(上下文ctxt,AppWidgetManager mgr,int[]appWidgetIds)
{
ComponentName me=新组件名(ctxt,AppWidget.class);
final-RemoteViews-updateViews=新的远程视图(ctxt.getPackageName(),R.layout.widget\u布局);
意图=新意图(ctxt,AppWidget.class);
setAction(AppWidgetManager.ACTION\u APPWIDGET\u UPDATE);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_id,appWidgetIds);
PendingEvent pi=PendingEvent.getBroadcast(ctxt,0,intent,PendingEvent.FLAG_UPDATE_CURRENT);
setonClickPendingContent(R.id.refresh,pi);
经理updateAppWidget(我,updateViews);
Intent intent2=新的Intent(ctxt,DetailsActivity.class);
意图2.设置行动(行动详情);
pendingent di=pendingent.getActivity(ctxt,0,intent2,0);
updateViews.setonClickPendingContent(R.id.detailsInfo,di);
经理updateAppWidget(我,updateViews);
for(int i=0;i
我的异步任务:
public class WeatherInfo extends AsyncTask<String, Void, Map>
{
private RemoteViews views;
private int WidgetID;
private AppWidgetManager WidgetManager;
private DetailsActivity detailsActivity;
public WeatherInfo(RemoteViews views, int appWidgetID, AppWidgetManager appWidgetManager)
{
this.views = views;
this.WidgetID = appWidgetID;
this.WidgetManager = appWidgetManager;
}
@Override
protected Map doInBackground(String... strings)
{
Document doc = null;
try
{
doc = Jsoup.connect("http://meteo.uwb.edu.pl/").get();
}
catch (IOException e)
{
Log.e("","Connection failed: " + e.getMessage());
return null;
}
Elements tables = doc.select("td");
Elements headers = tables.get(2).select("b");
Elements vals = tables.get(3).select("b");
Map all = new LinkedHashMap();
for (int i=0;i<headers.size() ; i++)
all.put(headers.get(i).text(),vals.get(i).text());
Global.weatherInfo = all;
return all;
}
@Override
protected void onPostExecute(Map map)
{
if(map==null) return;
String txt = "";
String temp = (String) map.values().toArray()[0];
String hum = (String) map.values().toArray()[1];
String pressure = (String) map.values().toArray()[2];
String temp2 = "Odczuwalna: " + map.values().toArray()[3];
views.setTextViewText(R.id.info_temp, temp);
views.setTextViewText(R.id.info_temp2, temp2);
views.setTextViewText(R.id.info_hum, hum);
views.setTextViewText(R.id.info_pressure, pressure);
WidgetManager.updateAppWidget(WidgetID, views);
}
}
公共类WeatherInfo扩展异步任务
{
私人远程视图;
私有int-WidgetID;
私有AppWidgetManager-WidgetManager;
私人详细活动详细活动;
公共天气信息(远程视图视图、int-appWidgetID、AppWidgetManager-AppWidgetManager)
{
this.views=视图;
this.WidgetID=appWidgetID;
this.WidgetManager=appWidgetManager;
}
@凌驾
受保护地图背景(字符串…字符串)
{
单据单据=空;
尝试
{
doc=Jsoup.connect(“http://meteo.uwb.edu.pl/).get();
}
捕获(IOE异常)
{
Log.e(“,”连接失败:“+e.getMessage());
返回null;
}
元素表=文件选择(“td”);
元素头=表。获取(2)。选择(“b”);
元素VAL=表格。获取(3)。选择(“b”);
Map all=新建LinkedHashMap();
对于(int i=0;i分别创建AsyncTask。从postexecute()方法返回值。Handler将为您提供更好的解决方案来处理asynktask的响应。
在填充UI组件中的值之前调用此asynctask。可以通过对话框单独处理错误情况,也可以根据需要进行处理。
我通过将数据存储在sqlite数据库中使其工作。因此,在小部件刷新后,所有数据都保存到数据库中。数据库也是用于数据缓存的,因此如果没有internet连接,小部件将取消缓存数据。相同的缓存数据将加载到我的活动中显示。我知道处理程序/消息是如何工作的,但如果我使用它,如何将其结果传递给我的widged?以及如何在widget按钮刷新时启动线程/任务?我还更新了我的问题