小部件上的 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文本