【问题标题】:TextView not getting updated in android app widgetsTextView 未在 android 应用小部件中更新
【发布时间】:2013-06-19 20:55:47
【问题描述】:

我正在使用 asynctask 来执行我的功能并在那里获取值。但是我的文本视图没有得到更新,尽管我的日志语句给了我结果。

我在这里没有使用自定义意图,只是基本的。

这是我的代码 sn-ps:

    public class ListViewWidget extends AppWidgetProvider{

     public void onUpdate(Context context, AppWidgetManager appWidgetManager,
                int[] appWidgetIds) {

        super.onUpdate(context, appWidgetManager, appWidgetIds);
        updateViews = new RemoteViews(context.getPackageName(), R.layout.list_layout);             
        thisWidget = new ComponentName(context, ListViewWidget.class);
        FetchTask fetchTask=new FetchTask();
        AppWidgetManager.getInstance(context.getApplicationContext());
        fetchTask.execute();

        }

//FetchTask

    public static class FetchTask extends AsyncTask<URL,Integer,String> implements ServerRequestEnvironment{

    protected String doInBackground(URL... arg0) {
    //logic part and stuff not entered

    //This is the end part that returns me the result, which is not getting printed to text view.

          String name="";
          int i = new Random().nextInt(27);
          storeObject=store.getStores().getItems().get(i).getStore();

          name= storeObject.getName();
          resultStuff(name);
          Log.i("StoreTag","storeval:"+name);   //returns name of the 0th item      

                return name;
    }//end of doInBackground() method

    protected void onPostExecute(String name) {
                // TODO Auto-generated method stub
          Intent intent=new Intent("android.appwidget.action.APPWIDGET_UPDATE");

          PendingIntent pendingIntent=PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
          updateViews.setTextViewText(R.id.text_view,resultStuff(name));
          updateViews.setOnClickPendingIntent(R.id.next, pendingIntent);

          AppWidgetManager manager = AppWidgetManager.getInstance(context.getApplicationContext());

          manager.updateAppWidget(thisWidget, updateViews);
    }//end of PostExecute

    }//End of async task class
    }//end of ListViewWidget class

我在这里缺少什么?请指导..

更新:这样好吗?在 onReceive 和 onUpdate 中都调用异步任务??

@覆盖 public void onReceive(Context context,Intent intent){

    if(intent.getAction().equals("android.appwidget.action.APPWIDGET_UPDATE")){
        fetchTask.execute();
    }
}

更新 2:

 public static String name="New text"

public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) {

        super.onUpdate(context, appWidgetManager, appWidgetIds);
        updateViews = new RemoteViews(context.getPackageName(), R.layout.list_layout);

//-----------NEW LINE ADDED-------------
            updateViews.setTextViewText(R.id.text_view,name);
        thisWidget = new ComponentName(context, ListViewWidget.class);

        //Now in onPostExecute()
        //AppWidgetManager manager = AppWidgetManager.getInstance(context.getApplicationContext());
        //manager.updateAppWidget(thisWidget, updateViews);

        fetchTask.execute();

    }
protected void onPostExecute(String name) {
            // TODO Auto-generated method stub
            Intent intent=new Intent("android.appwidget.action.APPWIDGET_UPDATE");

            PendingIntent pendingIntent=PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
            updateViews.setTextViewText(R.id.text_view,name);
            updateViews.setOnClickPendingIntent(R.id.next, pendingIntent);

            AppWidgetManager manager = AppWidgetManager.getInstance(context.getApplicationContext());
            manager.updateAppWidget(thisWidget, updateViews);
        }

@Dororo 没找到你。请解释。我在课堂上创建了公共变量:

public static Context context;
        public static RemoteViews updateViews;
        public static ComponentName thisWidget;
        FetchTask fetchTask=new FetchTask(); 

【问题讨论】:

  • 意图收到了吗?可以贴一下接收端的代码吗?
  • 我没有写 onReceive() 方法,因为我没有从上面的这些方法中得到什么调用。即使对于这个 android.appwidget.action.APPWIDGET_UPDATE,是否需要为每个意图调用 onReceive()?
  • @SarenInden 嘿,请检查我的更新..

标签: android android-asynctask textview android-appwidget


【解决方案1】:

你试过用这个吗:

TextView textView = (TextView) findViewById(R.id.textView);
textView.setText(toThis);

【讨论】:

  • 我正在使用安卓应用小部件。它不使用 findViewById。它具有远程视图及其调用集。
【解决方案2】:

您确定在创建 new ComponentName(context, ListViewWidget.class); 时没有覆盖更新后的值吗? onUpdate 将在您调用manager.updateAppWidget(thisWidget, updateViews); 时被调用您不需要使用static,您只需要在第一次创建对象后将boolean 设置为true

【讨论】:

  • resultStuff(name) 在我的调试模式下获取值。所以我需要使用onReceive。我在 onPostExecute() 中设置 Intent 的 Action。还有 textView.invalidate(),我应该在设置我的 textView 之前放置吗??
  • 你确定你没有进入循环吗? android.appwidget.action.APPWIDGET_UPDATE 不应该调用onUpdate() 来重置你的视图(因为你创建了一个new 一个)?
  • 没找到你。请解释。我在我的类中为 RemoteViews 对象和 ComponentName 创建了公共 var。
  • 更新onPostExecute(String name)中的文本视图后,您需要通过调用答案中的代码来更新应用小部件。
  • 我正在更新我的 onPostExecute..检查上面..覆盖如何?
【解决方案3】:

解决了我的异常和错误。将上下文设置为空。我为应用程序上下文分配了上下文。

【讨论】:

    猜你喜欢
    • 2012-08-23
    • 1970-01-01
    • 2013-03-21
    • 2012-11-13
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多