【问题标题】:Text in widget not changing小部件中的文本未更改
【发布时间】:2014-05-03 17:26:22
【问题描述】:

我目前正在开发一个可以倒计时到开学时间的小部件。我已经对其进行了测试,并且除了一件事之外它都可以工作;小部件中的文本不会改变

这是我的代码(BGSWidgetProvider.java):

包 com.bordengrammar.bordengrammarapp;

import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.widget.RemoteViews;

import com.bordengrammar.bordengrammarapp.utils.ut;

import java.util.Calendar;
import java.util.Timer;
import java.util.TimerTask;

public class BGSWidgetProvider extends AppWidgetProvider {

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

        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new MyTime(context, appWidgetManager), 1, 1000);
    }

    private class MyTime extends TimerTask {
        RemoteViews remoteViews;
        AppWidgetManager appWidgetManager;
        ComponentName thisWidget;       

        public MyTime(Context context, AppWidgetManager appWidgetManager) {
            this.appWidgetManager = appWidgetManager;
            remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
            thisWidget = new ComponentName(context, BGSWidgetProvider.class);
        }

        @Override
        public void run() {
            remoteViews.setTextViewText(R.id.hours, hour());
            remoteViews.setTextViewText(R.id.minutes, minutes());
            ut.logIt(minutes());
            ut.logIt(hour());
            appWidgetManager.updateAppWidget(thisWidget, remoteViews);
        }




        public String hour() {
            /*
            * Work out whether tommorow is right day, (Right meaning mon-fri)
            * If it is work out the amount of hours and minutes until 8.30am tommorow
            * Else work out how many days, hours and minutes until monday 8.30am
            *
             */
            String result;
            Calendar now = Calendar.getInstance();
            int currentDay = now.get(Calendar.DAY_OF_WEEK);

            Calendar school = Calendar.getInstance();
            school.add(Calendar.DAY_OF_YEAR, 1);
            if (currentDay == Calendar.SATURDAY)
            {
                school.add(Calendar.DAY_OF_YEAR, 1);
            }
            else if (currentDay == Calendar.FRIDAY)
            {
                school.add(Calendar.DAY_OF_YEAR, 2);
            }

            school.set(Calendar.HOUR_OF_DAY, 8);
            school.set(Calendar.MINUTE, 30);
            long millisLeft = school.getTimeInMillis() - now.getTimeInMillis();
            long hoursLeft = millisLeft / (60 * 60 * 1000); 
            String hours = Long.toString(hoursLeft);        
            return hours;


        }
        public String minutes() {
            /*
            * Work out whether tommorow is right day, (Right meaning mon-fri)
            * If it is work out the amount of hours and minutes until 8.30am tommorow
            * Else work out how many days, hours and minutes until monday 8.30am
            *
             */         
            Calendar now = Calendar.getInstance();
            int currentDay = now.get(Calendar.DAY_OF_WEEK);

            Calendar school = Calendar.getInstance();
            school.add(Calendar.DAY_OF_YEAR, 1);
            if (currentDay == Calendar.SATURDAY)
            {
                school.add(Calendar.DAY_OF_YEAR, 1);
            }
            else if (currentDay == Calendar.FRIDAY)
            {
                school.add(Calendar.DAY_OF_YEAR, 2);
            }

            school.set(Calendar.HOUR_OF_DAY, 8);
            school.set(Calendar.MINUTE, 30);

            long millisLeft = school.getTimeInMillis() - now.getTimeInMillis();         
            long minutesLeft =  (millisLeft % (60 * 60 * 1000)) / (60 * 1000);          
            String minutes = Long.toString(minutesLeft);


            return minutes;


        }



    }

我的布局(widget_layout.xml):

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+id/layout"
              android:orientation="horizontal"
              android:layout_width="250dp"
              android:layout_height="72dp"
              android:background="@color/bordenpurple">


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="10"
        android:textSize="60dp"
        android:paddingTop="5dp"
        android:paddingLeft="5dp"
        android:paddingRight="5dp"
        android:textColor="@color/bordenyellow"
        android:typeface="sans"
        android:id="@+id/hours"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:text="Hours"
        android:id="@+id/textView"
        android:textColor="@color/bordenyellow"
        android:padding="5dp"
        android:layout_marginLeft="-10dp"
        />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="10"
        android:textSize="60dp"
        android:paddingTop="5dp"
        android:paddingLeft="5dp"
        android:paddingRight="5dp"
        android:textColor="@color/bordenyellow"
        android:typeface="sans"
        android:id="@+id/minutes"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:text="Minutes"
        android:id="@+id/textView3"
        android:textColor="@color/bordenyellow"
        android:padding="5dp"
        android:layout_marginLeft="-7dp"
        />

</LinearLayout>

如你所见,我在 run 方法中放了一个日志语句来测试我的代码,它可以工作,这是我的 logcat:

05-03 18:24:30.874    8011-8029/com.bordengrammar.bordengrammarapp E/Logger﹕ 38
05-03 18:24:31.878    8011-8029/com.bordengrammar.bordengrammarapp E/Logger﹕ 6
05-03 18:24:31.878    8011-8029/com.bordengrammar.bordengrammarapp E/Logger﹕ 38
05-03 18:24:32.878    8011-8029/com.bordengrammar.bordengrammarapp E/Logger﹕ 6
05-03 18:24:32.878    8011-8029/com.bordengrammar.bordengrammarapp E/Logger﹕ 38
05-03 18:24:33.878    8011-8029/com.bordengrammar.bordengrammarapp E/Logger﹕ 6
05-03 18:24:33.878    8011-8029/com.bordengrammar.bordengrammarapp E/Logger﹕ 38
05-03 18:24:34.878    8011-8029/com.bordengrammar.bordengrammarapp E/Logger﹕ 6
05-03 18:24:34.878    8011-8029/com.bordengrammar.bordengrammarapp E/Logger﹕ 38
05-03 18:24:35.874    8011-8029/com.bordengrammar.bordengrammarapp E/Logger﹕ 6
05-03 18:24:35.874    8011-8029/com.bordengrammar.bordengrammarapp E/Logger﹕ 38
05-03 18:24:36.878    8011-8029/com.bordengrammar.bordengrammarapp E/Logger﹕ 6
05-03 18:24:36.878    8011-8029/com.bordengrammar.bordengrammarapp E/Logger﹕ 38

我不知道如何解决这个问题,我们将不胜感激!

【问题讨论】:

    标签: android android-layout android-widget textview


    【解决方案1】:

    切勿在小部件中使用TimerAppWidgetProviderBroadcastReceiver,它意味着只在很短的时间内保持活动状态以处理它收到的广播 Intent,然后在处理完广播和 onUpdate() 方法后的任何时刻都可以将其销毁返回(但小部件当然会保持可见)。

    Android 通常会每 30 分钟调用一次小部件更新代码,因此您不必担心手动刷新它,只需将显示代码(当前位于 run())移动到 onUpdate()

    【讨论】:

    • 可以,但是因为是倒计时,所以需要每分钟刷新一次
    • 对,那么您需要使用 AlarmManager 每分钟向您的 AppWidgetProvider 发送带有您选择的特殊操作的广播意图。然后在 onReceive() 中处理它并调用您的更新代码。但是,当您的倒计时结束时,请务必禁用 AlarmManager 刷新,因为如果您的小部件每分钟而不是每 30 分钟更新一次,它会耗尽您的电池电量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 2016-08-08
    • 1970-01-01
    相关资源
    最近更新 更多