【问题标题】:TextView on widget not updating using OnUpdate method小部件上的 TextView 未使用 OnUpdate 方法更新
【发布时间】:2013-02-02 07:38:56
【问题描述】:

我有一个使用 TextView 显示数字时钟的小部件,我希望在其中更新频率超过 xml 中允许的 30 分钟。我看过一些例子,但我喜欢有人帮助我解决我的具体问题。该小部件已正确配置且工作正常,但不会像应有的那样更新,因为它是一个数字时钟。

    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
        int[] appWidgetIds) {
    final int N = appWidgetIds.length;

    for (int i = 0; i < N; i++) {
        int appWidgetId = appWidgetIds[i];

        Intent clockIntent = new Intent(context, DeskClock.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
                clockIntent, 0);

        RemoteViews views = new RemoteViews(context.getPackageName(),
                R.layout.digitalclock);
        views.setOnClickPendingIntent(R.id.gl, pendingIntent);

        java.util.Date noteTS = Calendar.getInstance().getTime();

        String time = "kk:mm";
        views.setTextViewText(R.id.tvTime, DateFormat.format(time, noteTS));

        String date = "dd MMMMM yyyy";
        views.setTextViewText(R.id.tvDate, DateFormat.format(date, noteTS));

        appWidgetManager.updateAppWidget(appWidgetId, views);
    }
}

xml android:updateperiodmills 仅每 30 分钟更新一次,但我需要至少每秒更新或设置 TextView,就像我在主应用程序中使用 run 方法完成的那样。非常感谢任何帮助。谢谢

编辑

public class DigitalClock extends AppWidgetProvider {

public void onUpdate(Context context, AppWidgetManager appWidgetManager,
        int[] appWidgetIds) {
    final int N = appWidgetIds.length;

    for (int i = 0; i < N; i++) {
        int appWidgetId = appWidgetIds[i];

        Intent clockIntent = new Intent(context, DeskClock.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
                clockIntent, 0);

        final RemoteViews views = new RemoteViews(context.getPackageName(),
                R.layout.digitalclock);
        views.setOnClickPendingIntent(R.id.gl, pendingIntent);

        final java.util.Date noteTS = Calendar.getInstance().getTime();
        final String time = "kk:mm";
        final String date = "dd MMMMM yyyy";


        BroadcastReceiver mBroadcastTime = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {

                views.setTextViewText(R.id.tvTime,
                        DateFormat.format(time, noteTS));

                views.setTextViewText(R.id.tvDate,
                        DateFormat.format(date, noteTS));
            }
        };

        IntentFilter mTime = new IntentFilter(Intent.ACTION_TIME_TICK);
        registerReceiver(mBroadcastTime, mTime);

        appWidgetManager.updateAppWidget(appWidgetId, views);
    }
}

private void registerReceiver(BroadcastReceiver mBroadcastTime,
        IntentFilter mTime) {

}
}

现在这是我的课,但我必须添加这个方法:

    private void registerReceiver(BroadcastReceiver mBroadcastTime,
        IntentFilter mTime) {

}

我该怎么办?

【问题讨论】:

    标签: android android-widget broadcastreceiver textview


    【解决方案1】:

    您可以注册BroadcastReceiver 并监听ACTION_TIME_TICK 操作。

    这将每分钟调用一次。

    BroadcastReceiver mBroadcastTime = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                // Change the time on your widget
            }
        };
    
    IntentFilter mTime = new IntentFilter(Intent.ACTION_TIME_TICK);
    registerReceiver(mBroadcastTime, mTime);
    

    【讨论】:

    • 感谢您的帮助,但它要我创建一个方法?不知道我应该用它做什么..?
    【解决方案2】:

    您必须使用AlaramManager 来实现此功能。

    我在我的时钟小部件中以下列方式使用。

    闹铃倒计时:

     class CountSecond extends CountDownTimer
            {
                public CountSecond(long millisInFuture, long countDownInterval) {
                    super(millisInFuture, countDownInterval);
                    // TODO Auto-generated constructor stub
    
                    Intent intent = new Intent(ClockWidget.CLOCK_WIDGET_UPDATE);
                     intent.putExtra("theme", SelectedTheme);
                    sendBroadcast(intent);
                }
    
                @Override
                public void onFinish() {
                    // TODO Auto-generated method stub
                    Log.d("CL1 Service ","--- count finish ");
                    //setTimertoUpdate();
    
    
                    AlarmManager alarmManager = (AlarmManager)ClockWidgetSetting.this.getSystemService(Context.ALARM_SERVICE);
                    Calendar calendar = Calendar.getInstance();
                    calendar.setTimeInMillis(System.currentTimeMillis());
                    //calendar.add(Calendar.MINUTE, 1);
                    alarmManager.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), 60000, createClockTickIntent(ClockWidgetSetting.this));
                    //finish();
    
                }
    
                @Override
                public void onTick(long millisUntilFinished) {
                    // TODO Auto-generated method stub
                }
    
            }
    

    调用小部件appwidgetprovider 的意图如下。这样小部件的onUpdate() 就会被调用。

     private PendingIntent createClockTickIntent(Context context) {
                Intent intent = new Intent(ClockWidget.CLOCK_WIDGET_UPDATE);
                intent.putExtra("theme", SelectedTheme);
                PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
                return pendingIntent;
            }
    

    【讨论】:

    • @timmo15 检查我的答案并通知我这是否对您有帮助。
    • 感谢@Rahil2952 的帮助,但我遇到了很多错误,你的课程对我有用。我会看看 AlarmManager 方法,看看我能找到什么..
    猜你喜欢
    • 2013-02-09
    • 2013-03-21
    • 2013-02-25
    • 1970-01-01
    • 2017-06-27
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多