小部件上的 TextView 未使用 OnUpdate 方法更新

Posted

技术标签:

【中文标题】小部件上的 TextView 未使用 OnUpdate 方法更新【英文标题】:TextView on widget not updating using OnUpdate method 【发布时间】: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) 


我该怎么办?

【问题讨论】:

【参考方案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 方法,看看我能找到什么..

以上是关于小部件上的 TextView 未使用 OnUpdate 方法更新的主要内容,如果未能解决你的问题,请参考以下文章

如何在android编程中获取放置在小部件上的textview文本

如何从小部件上的 TextView 获取默认文本大小?

Android主屏幕小部件未更新

如何将垂直滚动 TextView 添加到 Android 小部件

使用 API 数据更新小部件的 TextView

在小部件中单击 textview 时更改图标