Java 小部件上的2个按钮-刷新和显示活动

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

我有两个按钮,一个是id刷新按钮,另一个是id详细信息按钮。第一个按钮应触发小部件更新,第二个按钮显示详细信息(小部件刷新后下载)。 这是天气小部件。应触发刷新以下载完整的天气数据。基本天气信息应直接显示在小部件上,详细活动的完整数据,在detailsInfo按钮上启动

这是我的代码:

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按钮刷新时启动线程/任务?我还更新了我的问题