- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在为应用程序开发 Android 小部件,问题是我无法在 RemoteViewsFactory
中的按钮上设置 onClickPendingIntent()
。
我解释一下:我创建了一个 AppWidgetProvider
,它调用 RemoteViewsService
的扩展,它调用 RemoteViewsFactory
的扩展来完成一个 ListView
在我的小部件中。RemoteViewsFactory
必须返回所有项目以进行更新或创建它们并显示在小部件上。但是对于 ListView 的每个项目,我有两种类型的按钮:
问题是第二个按钮,我的解决方案不起作用。
问题是:
因此,这是不起作用的代码:
row.setOnClickPendingIntent(R.id.taskButton, onClickPendingIntent);
// Creating an onclick event for the done button
Intent doneIntent = new Intent(mContext, WidgetProvider.class);
doneIntent.putExtra("DONE_TASK", "DOOOOM");
PendingIntent onDoneIntent = PendingIntent.getActivity(mContext, 0, doneIntent, 0);
row.setOnClickPendingIntent(R.id.doneButton, onDoneIntent);
这是完整的 WidgetFactory
类:
import java.util.Collections;
import java.util.Comparator;
import java.util.GregorianCalendar;
import java.util.Vector;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import android.view.View;
import android.widget.RemoteViews;
import android.widget.RemoteViewsService;
public class WidgetFactory implements RemoteViewsService.RemoteViewsFactory {
private Vector<EventInfo> mAllEvents;
private Context mContext;
public WidgetFactory(Context ctxt, Intent intent) {
// Creating member vars
mContext = ctxt;
updateAllEventsVector();
}
private void updateAllEventsVector() {
SharedInstances sharedInstances = SharedInstances.get();
mAllEvents = new Vector<EventInfo>();
if (sharedInstances != null) {
TaskRequestManager taskManager = sharedInstances
.getTaskRequestManager();
CalendarRequestManager calManager = sharedInstances
.getCalendarRequestManager();
Vector<TaskEvent> tasks = null;
Vector<CalendarEvent> events = null;
if (taskManager != null)
tasks = taskManager.readTasksToday(mContext);
if (calManager != null)
events = calManager.readCalendarEventsToday(mContext);
if (!tasks.isEmpty())
mAllEvents.addAll(tasks);
if (!events.isEmpty())
mAllEvents.addAll(events);
mAllEvents = sortByDate(mAllEvents);
}
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public Vector<EventInfo> sortByDate(Vector<EventInfo> events)
{
Vector<EventInfo> sortedEvents = new Vector<EventInfo>();
for(EventInfo event : events)
{
if ((event.getStartTime()+event.getEventDuration()) > GregorianCalendar.getInstance().getTimeInMillis())
sortedEvents.add(event);
}
Collections.sort(events, new Comparator() {
public int compare(Object arg0, Object arg1)
{
EventInfo event0 = (EventInfo)arg0;
EventInfo event1 = (EventInfo)arg1;
if (event0.getStartTime()+event0.getEventDuration() > event1.getStartTime()+event1.getEventDuration())
return 1;
else if (event0.getStartTime()+event0.getEventDuration() == event1.getStartTime()+event1.getEventDuration())
return 0;
else if (event0.getStartTime()+event0.getEventDuration() < event1.getStartTime()+event1.getEventDuration())
return -1;
return 0;
}
});
return sortedEvents;
}
@Override
public int getCount() {
return mAllEvents.size();
}
@Override
public long getItemId(int arg0) {
return (arg0);
}
@Override
public RemoteViews getLoadingView() {
return null;
}
@Override
public RemoteViews getViewAt(int position) {
// Getting item view
RemoteViews row = new RemoteViews(mContext.getPackageName(),
R.layout.done_task_item);
EventInfo eventInfo = mAllEvents.get(position);
row.setInt(R.id.item_event, "setBackgroundColor", Color.argb(60, Color.red(eventInfo.getColor()), Color.green(eventInfo.getColor()), Color.blue(eventInfo.getColor())));
// Converts startTime and endTime in string
String startTime = TimeCursor.getAdaptativeTime(eventInfo.getStartTime());
String endTime = TimeCursor.getAdaptativeTime((eventInfo
.getEventDuration() + eventInfo.getStartTime()));
//Get title
String title = eventInfo.getTitle();
// Setting data in the view
row.setTextViewText(R.id.titleTask, title);
row.setTextViewText(R.id.periodTask, startTime + " to " + endTime);
//Check type of event
if (eventInfo.isTask()) {
//endDate > GregorianCalendar.getInstance().getTimeInMillis() ) {
//Check if action exists
if (eventInfo.getAction() != null) {
//Get the action title
String action = eventInfo.getAction()
.getTitleText();
//Create a onClickPendingIntent for taskButton
PendingIntent onClickPendingIntent = null;
//Add related button
if (action.equals("Call"))
{
//Set call icon to taskButton
row.setImageViewResource(R.id.taskButton, R.drawable.ic_call_white );
//Get numbers from the contact
Vector<TelOrEmailItem> tel = eventInfo.getContact().getAllPhoneNumbers(mContext.getResources() , mContext, eventInfo.getAction());
// Creating an onclick event for call somebody
Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+tel.get(0).getMainText()));
onClickPendingIntent = PendingIntent.getActivity(
mContext, 0, callIntent, 0);
}
else if (action.equals("SMS"))
{
//Set sms icon to taskButton
row.setImageViewResource(R.id.taskButton, R.drawable.ic_sms_white);
//Get numbers from the contact
Vector<TelOrEmailItem> tel = eventInfo.getContact().getAllPhoneNumbers(mContext.getResources() , mContext, eventInfo.getAction());
// Creating an onclick event for call somebody
Intent smsIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:"+tel.get(0).getMainText()));
onClickPendingIntent = PendingIntent.getActivity(
mContext, 0, smsIntent, 0);
}
/*else if (action.equals("Chat with"))
row.setImageViewResource(R.id.taskButton, R.drawable.ic_chat_white);*/
else if (action.equals("eMail") || action.equals("Mail") || action.equals("Write to"))
{
//Set email icon to taskButton
row.setImageViewResource(R.id.taskButton, R.drawable.ic_email_white);
//Get numbers from the contact
Vector<TelOrEmailItem> tel = eventInfo.getContact().getAllEMails(mContext, eventInfo.getAction());
//Creating an onclick event for email somebody
Intent emailIntent = new Intent(Intent.ACTION_SEND);
emailIntent.setType("plain/text");
emailIntent.putExtra(Intent.EXTRA_EMAIL,
new String[]{tel.get(0).getMainText()});
onClickPendingIntent = PendingIntent.getActivity(
mContext, 0, emailIntent, 0);
}
/*else if (action.equals("Skype"))
row.setImageViewResource(R.id.taskButton, R.drawable.ic_skype_white);*/
//Assign the intent to the taskButton
row.setOnClickPendingIntent(R.id.taskButton, onClickPendingIntent);
// Creating an onclick event for the done button
Intent doneIntent = new Intent(mContext, WidgetProvider.class);
doneIntent.putExtra("DONE_TASK", "DOOOOM");
PendingIntent onDoneIntent = PendingIntent.getActivity(mContext, 0, doneIntent, 0);
row.setOnClickPendingIntent(R.id.doneButton, onDoneIntent);
}
else
row.setViewVisibility(R.id.taskButton, View.GONE); //hidde the taskButton
return row;
}
//Check if it's an event
else if(eventInfo.isEvent()) {
//hidde task button (Done)
row.setViewVisibility(R.id.doneButton, View.GONE);
CalendarEvent ev = eventInfo.getCalendarEvent();
String location = ev.getEventLocation();
if (location != null && !location.isEmpty())
{
//Set the locate icon on the taskButton
row.setImageViewResource(R.id.taskButton, R.drawable.ic_locate_white);
//Define the place to open the map
Intent mapIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("geo:0,0?q="+location));
PendingIntent onMapIntent = PendingIntent.getActivity(
mContext, 0, mapIntent, 0);
row.setOnClickPendingIntent(R.id.taskButton, onMapIntent);
}
else
row.setViewVisibility(R.id.taskButton, View.GONE);
return row;
}
return null;
}
@Override
public int getViewTypeCount() {
return 1;
}
@Override
public boolean hasStableIds() {
return (true);
}
@Override
public void onCreate() {
}
@Override
public void onDataSetChanged() {
// On data changes, update mTasks
updateAllEventsVector();
}
@Override
public void onDestroy() {
mAllEvents = null;
}
}
谢谢你:)
编辑:耶耶!问题解决与否...
方法 onClickPendingIntent()
现在可以使用了,这里是代码:
// Creating an onclick event for the done button
Intent onClickDone = new Intent(mContext, DoneTaskActivity.class);
onClickDone.putExtra("TASK_ID", eventInfo.getTaskEvent().getTaskId());
PendingIntent onClickPendingDone = PendingIntent.getActivity(mContext, 0, onClickDone, 0);
row.setOnClickPendingIntent(R.id.doneButton, onClickPendingDone);
但存在另一个问题:DoneTaskActivity
没有收到声明为 TASK_ID
的额外内容。在DoneTaskActivity
的onCreate()
方法中,Bundle
参数中的var保持为null
。
帮助:(
最佳答案
在小部件中使用 ListView 时,您需要使用 setOnClickFillInIntent听众。来自官方文档;
When using collections (eg. ListView, StackView etc.) in widgets, it is very costly to set PendingIntents on the individual items, and is hence not permitted. Instead a single PendingIntent template can be set on the collection
在您的 RemoteViewsFactory 中,您可以像这样使用它;
public RemoteViews getViewAt(int position) {
// position will always range from 0 to getCount() - 1.
// Construct a RemoteViews item based on the app widget item XML file, and set the
// text based on the position.
RemoteViews rv = new RemoteViews(mContext.getPackageName(), R.layout.widget_item);
rv.setTextViewText(R.id.widget_item, mWidgetItems.get(position).text);
// Next, set a fill-intent, which will be used to fill in the pending intent template
// that is set on the collection view in StackWidgetProvider.
Bundle extras = new Bundle();
extras.putInt(StackWidgetProvider.EXTRA_ITEM, position);
Intent fillInIntent = new Intent();
fillInIntent.putExtras(extras);
// Make it possible to distinguish the individual on-click
// action of a given item
rv.setOnClickFillInIntent(R.id.widget_item, fillInIntent);
...
// Return the RemoteViews object.
return rv;
}
您还需要使用标准的 PendingIntent,因为单个列表项无法设置 PendingIntents,请参阅 AppWidgets 上的文档.
关于java - RemoteViewsFactory 中的 onClickPendingIntent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11722657/
我的应用小部件在多种模式下运行。对于其中的每一种模式,我都创建了一个 RemoteViewsFactory。为了在模式之间切换,我向我的 AppWidgetProvider 发送了一个 Intent
我正在创建一个简单的 Android 小部件,用于从网站获取并显示一些电影封面。显示图像的 GridView 很简单。该小部件工作正常,但当我开始滚动时,我得到了 OutOfMemoryError 并
我已尽力按照 developer.android.com 上的说明进行操作但似乎我在某个地方犯了一个我无法弄清楚的愚蠢错误。 在连续记录之后,我意识到在我的 RemoteViewsFactory 实现
有一个带有 Listview 的 AppWidget,我想用 RemoteViewsService.RemoteViewsFactory 填充它。 我有以下错误 E/AndroidRuntime(12
我正在为我的应用程序开发小部件,它基于 StackView 并且应该显示一些项目。项目的数量可能会因用户操作而异——可以说这是某种收藏夹菜单。我已经实现了 RemoteViewsFactory 后代来
我正在为应用程序开发 Android 小部件,问题是我无法在 RemoteViewsFactory 中的按钮上设置 onClickPendingIntent()。 我解释一下:我创建了一个 AppWi
我在应用程序小部件中有一个应用程序启动器。我想从 RemoteViewsFactory 开始 Activity 。但它没有用。 这是我在 RemoteViewsFactory 中的代码: @Overr
我有一个显示图 block GridView 的 Android 应用小部件。每个图 block 都包含股票报价信息。我从网络服务器查询股票报价信息并将其存储在 ArrayList (stock_in
我创建了一个带有 ListView 的应用程序小部件。在 RemoteViewsFactory 类中,我从 SQLite 数据库填充列表。一切都很好,但是如果我在 updateWidget() 方法中
我想发布一个问题的解决方案。希望它能帮助其他面临同样问题的人。 这与可用的 Android 通用图像加载器库有关 here 原始问题是: 我今天开始使用你们的 Android Universal Im
有时,当我的小部件正在更新时,我会在日志中看到: .. getViewAt position = 7 getViewAt position = 7.. RemoteViews 对象第一次放在位置 0,
由于 RemoteViewFactory 中没有 getItemViewType() 方法 - 它实际上如何确定 ViewType? 我偶然发现了一个案例,我肯定只有 4 个 View 类型,但不断出
我有一个小部件,我试图用它在 ListView 中显示来 self 的应用程序本地数据库的信息。 我正在使用 RemoteViewsService.RemoteViewsFactory 接口(inte
目前,我的 AppWidgetProvider有一个静态数据。用于传递信息 AppWidgetProvider & RemoteViewsService.RemoteViewsFactory publ
我正在尝试获取一些最新的电影图像并将它们显示在 Android 应用小部件中,根据要求,小部件应每小时刷新一次以获取最新的电影图像。 由于我在整个应用程序中使用协程,因此我需要使用现有的具有挂起功能的
我正在尝试使用小部件实现 android 应用程序,但在 nexus 5 设备上发现了奇怪的行为(我有两个 - 一个是 Lollipop ,一个是棉花糖)。如果我调用 AppWidgetManager
我有一个 AppWidget,其中包含一个 StackView。除了 AppWidget,我还有一项服务,当用户将我的 AppWidget 添加到他们的主屏幕时启动,该服务每两小时轮询一次新数据。当服
我根据 android 文档开发了我的 AppWidget,在 onCreate() 中加载我的光标并在 onDataSetChanged() 中重新加载它,并且一切正常,直到我在 RemoteVie
我是一名优秀的程序员,十分优秀!