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

时间:2015-06-15 07:28:56

标签: java android android-activity onclick widget

我有带有2个按钮的小部件按钮,带有id刷新,第二个按钮带有id detailsInfo。第一个按钮应该触发小部件更新,第二个按钮显示详细信息(在小部件刷新后下载)。 这是天气小部件。刷新应触发下载全天候数据。基本天气信息应直接显示在窗口小部件上,详细活动的完整数据,在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();

    }
}

WeatherInfo是实际执行天气详细信息下载的类(它扩展了AsyncTask)。如您所见,它将我的updateViews作为构造函数参数,然后设置我的小部件上显示的基本天气信息。

但是,我不知道如何显示详细的信息活动并将详细的天气信息传递给它。当我尝试如上所示运行我的活动时,我的窗口小部件无法加载(&#34;问题加载窗口小部件&#34;),没有任何我可以调试的例外。

任何想法我做错了什么?

[编辑] 这似乎(差不多)好了:

窗口小部件提供程序:

 @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();

    }

我的异步任务:

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静态字段的Global类来分享我的线程和细节活动之间的值。

然而,有两件事我不知道如何解决:   - 如果活动被销毁(从Android上的最后一个应用列表中删除),在我按下我的小部件上的详细信息按钮后,活动为空(因此Global.weather信息为空)。我需要再次触发小部件刷新然后启动我的活动   - 如果我尝试在PostExecute方法中设置Global.weatherInfo我的小部件无法显示,没有任何异常抛出 - 为什么? - 我还试图在创建我的活动时触发我的异步任务。所以我创建了第二个WeatherInfo构造函数并将DetailSActivity对象传递给它,以便能够刷新我的活动。即使我不使用第二个构造函数,我的小部件也无法正常加载。

我很困惑,有人能告诉我这里发生了什么吗?以及如何解决我的问题?

2 个答案:

答案 0 :(得分:0)

单独创建AsyncTask。从postexecute()方法返回值。处理程序将为您提供更好的解决方案来处理asynktask的响应。 在填充UI组件中的值之前调用此asynctask。无论你想要什么,都可以通过对话框单独处理错误案例。 follow the link for clearance in handler

答案 1 :(得分:0)

我通过在sqlite数据库中存储数据使其工作。因此,在小部件刷新后,所有数据都将保存到数据库中。数据库也用于数据缓存,因此如果没有Internet连接,则widget会释放缓存的数据。将加载相同的缓存数据以显示在我的活动中。