- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到的问题是,当我调试我的小部件时,它会更改布局,但当我只是运行它时,它不起作用。根据我的调试消息,它设置了 setOnClickPendingIntent 但它没有启动我的服务。
简而言之,我的小部件仅在调试时有效。
这是我的小部件代码:
public class Widget extends AppWidgetProvider {
public static String SWITCH_SCREEN1 = "1";
public static String SWITCH_SCREEN2 = "2";
public static final String ADD_NOTE = "addNote";
public static final String MANAGE_REMINDERS = "manageReminders";
public static String TAKE_PICTURE = "takePicture";
private static int LAYOUTID = R.layout.widget_screen1;
/**
* This method is called when a widget is added to the home screen.
* It sets the listeners on the items and updates the screen with info from the database
*/
@Override
public void onEnabled(Context context) {
super.onEnabled(context);
setListeners(context);
updateScreenFromDatabase(context, AppWidgetManager.getInstance(context), AppWidgetManager.getInstance(context).getAppWidgetIds(new ComponentName(context, Widget.class)));
}
/**
* This method is called to update the widget. The Widget is called when the timeout set in widget.xml occurs.
*/
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);
updateScreenFromDatabase(context, appWidgetManager, appWidgetIds);
}
/**
* This method fetches the data from the database and puts it in the 2 text elements on the screen
* @param context
* @param appWidgetManager
* @param appWidgetIds
*/
private static void updateScreenFromDatabase(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {
if(LAYOUTID == R.layout.widget_screen1){
RemoteViews views = new RemoteViews(context.getPackageName(), LAYOUTID);
for(int i = 0 ; i < appWidgetIds.length ; i++){
String currentLesson = "No current lesson";
String nextLesson = "No next lesson";
LessonHour[] hours = Database.getInstance(context).getCurrentAndNextLessonHour();
if(hours[0] != null){
currentLesson = hours[0].getStart().get(GregorianCalendar.HOUR_OF_DAY) + ":" + Utils.adjustMinutes(hours[0].getStart().get(GregorianCalendar.MINUTE)) + " " + hours[0] .getLesson().getSummary();
}
if(hours[1] != null){
nextLesson = hours[1].getStart().get(GregorianCalendar.HOUR_OF_DAY) + ":" + Utils.adjustMinutes(hours[1].getStart().get(GregorianCalendar.MINUTE)) + " " + hours[1] .getLesson().getSummary();
}
views.setTextViewText(R.id.txt_widget_lesson1, currentLesson);
views.setTextViewText(R.id.txt_widget_lesson2, nextLesson);
appWidgetManager.updateAppWidget(new ComponentName(context, Widget.class), views);
}
}
}
/**
* This method is called when the screen of the widget should change.
* The action tells the method to which screen it should change.
* @param context
* @param action: the screen the method should switch to. Either WIDGET_SCREEN1 or WIDGET_SCREEN2
*/
public static void buildUpdate(Context context, String action){
RemoteViews views;
if(action.equals(SWITCH_SCREEN1)){
views = new RemoteViews(context.getPackageName(), R.layout.widget_screen1);
AppWidgetManager.getInstance(context).updateAppWidget(new ComponentName(context, Widget.class), views);
LAYOUTID = R.layout.widget_screen1;
updateScreenFromDatabase(context, AppWidgetManager.getInstance(context), AppWidgetManager.getInstance(context).getAppWidgetIds(new ComponentName(context, Widget.class)));
}
else if(action.equals(SWITCH_SCREEN2)){
views = new RemoteViews(context.getPackageName(), R.layout.widget_screen2);
AppWidgetManager.getInstance(context).updateAppWidget(new ComponentName(context, Widget.class), views);
LAYOUTID = R.layout.widget_screen2;
}
setListeners(context);
}
/**
* This methods sets the onclick listeners for the elements displayed on the screen
* @param context
*/
private static void setListeners(Context context){
AppWidgetManager manager = AppWidgetManager.getInstance(context);
int[] appWidgetIds = manager.getAppWidgetIds(new ComponentName(context, Widget.class));
for (int i = 0 ; i < appWidgetIds.length; i++){
if(LAYOUTID == R.layout.widget_screen1){
Log.e("khlrooster", "setting listeners on widget screen 1");
RemoteViews views = new RemoteViews(context.getPackageName(), LAYOUTID);
Intent intent = new Intent(context, SwitchWidgetScreenService.class);
intent.setAction(SWITCH_SCREEN2);
intent.setData(Uri.parse("uri::" + Math.random()));
Log.e("khlrooster", "action of listener for screen 1: " + intent.getAction());
PendingIntent pi = PendingIntent.getService(context, 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK);
views.setOnClickPendingIntent(R.id.imgbtn_switchDown, pi);
views.setOnClickPendingIntent(R.id.imgbtn_widget_notification, pi);
manager.updateAppWidget(new ComponentName(context, Widget.class), views);
Log.e("khlrooster", "listeners set on widget screen 1");
}
else if(LAYOUTID == R.layout.widget_screen2){
Log.e("khlrooster", "setting listeners on widget screen 2");
RemoteViews views = new RemoteViews(context.getPackageName(), LAYOUTID);
Intent intent2 = new Intent(context, SwitchWidgetScreenService.class);
intent2.setAction(SWITCH_SCREEN1);
PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent2, 0);
views.setOnClickPendingIntent(R.id.imgbtn_switchUp, pendingIntent);
intent2 = new Intent(context, LessonDetail.class);
intent2.setAction(ADD_NOTE);
pendingIntent = PendingIntent.getActivity(context, 0, intent2, 0);
views.setOnClickPendingIntent(R.id.imgbtn_notes, pendingIntent);
intent2= new Intent(context, LessonDetail.class);
intent2.setAction(TAKE_PICTURE);
pendingIntent = PendingIntent.getActivity(context, 0, intent2, 0);
views.setOnClickPendingIntent(R.id.imgbtn_photo, pendingIntent);
manager.updateAppWidget(new ComponentName(context, Widget.class), views);
Log.e("khlrooster", "listeners set on widget screen 2");
}
}
}
}
这是我的服务响应我的 Intent :
public class SwitchWidgetScreenService extends Service {
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
super.onCreate();
Log.e("khlrooster", "Created the SwitchWidgetScreenService");
}
@Override
public void onStart(Intent intent, int startId) {
//super.onStart(intent, startId);
Log.e("khlrooster", "started the SwitchWidgetScreenService");
handleEvent(intent);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
handleEvent(intent);
Log.e("khlrooster", "started the SwitchWidgetScreenService");
return super.onStartCommand(intent, flags, startId);
}
private void handleEvent(Intent intent) {
Log.e("khlrooster", "it works, the screen changes to: " + intent.getAction());
if(intent.getAction().equals(Widget.SWITCH_SCREEN1)){
Widget.buildUpdate(this, Widget.SWITCH_SCREEN1);
}else if(intent.getAction().equals(Widget.SWITCH_SCREEN2)){
Widget.buildUpdate(this, Widget.SWITCH_SCREEN2);
}
}
最佳答案
我解决了我的问题,我从数据库中获取数据后再次调用了setListeners。
关于Android appwidget 在运行时不启动服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5165841/
每当我运行命令以将 Virtualbox 驱动程序启动 Minishift 到操作系统主机时,它都需要一段疯狂的时间,而且它永远不会结束。有时我什至收到有关达到存储限制的错误消息。 不知道是不是描述h
您好,我正在使用 npm 运行一个基本的 React 项目,我正尝试在 docker 容器中启动它。但是我实际上无法让项目运行。我的 dockerfile 看起来像这样: FROM node:7.8.
所以我想从我的 SSH 终端开始游戏。 这真的很奇怪,当我直接从 Linux GUI 执行此操作时,它可以工作。但是当我使用 SSH 客户端进行远程连接时,它就崩溃了。似乎与我的显示驱动程序有关。 U
我有一个显示图像的动态壁纸。我在 Activity 中更改了该图像。然后我需要通知动态壁纸,以便它知道重新加载资源。 Intent 似乎是完美、简单的解决方案: Intent intent = new
我有一个似乎无法解决的问题。我在 Boot Dashboard 中使用 STS 3.9.2 从 Eclipse (Oxygen) 启动 Spring Boot 应用程序没有任何问题: 但是,当我尝试从
全新的 Python,在我开始摆弄东西之前先设置和安装东西。我的理解是 Python 2.7 和 Python 3.3 之间存在一些显着差异/不兼容,尽管这两个版本都得到了很好的使用,所以我认为最好安
在使用了很长时间的 jQuery 之后,我有一个问题,我正在使用 jQuery 模式(样式)编写一个简单的代码, (function(window, undefined) { var jQu
我正在尝试在 spring boot 应用程序下的非 spring 托管类中配置 Autowired。我在 tomcat 服务器下部署的 Web 应用程序下成功运行了这个。但是当我想在 spring
我对 xmonad 完全陌生,但我想开始使用它来提高我的工作效率。 这是我一直在使用的指南(我使用的是 Apple OS X Snow Leopard) http://xmonad.org/tour.
我试图将Spring Boot指南中的Managing Transactions示例扩展到两个数据源,但是@Transaction注释似乎仅对其中一个数据源有效。 在“Application.java
conEmu 有没有办法默认打开多个不同的选项卡? 我看到这个页面解释了如何使用 splits , 我意识到我可以按 Ctrl + T, 1, Enter,但我希望有一种方法可以自动执行此操作! "%
我正在寻找快速而肮脏的答案。我当时脑子一片空白,盯着屏幕看了 12 个小时以上,我想我中枪了。 我想做一个简单的 SignalR 应用程序作为教程。我找到了这个example ,但我不断收到票证未定义
我正在使用 Azure Powershell cmdlet 来启动/停止 VM。 Start-AzureVM [-ServiceName] [-Name] [ ] Stop-AzureVM [-S
我想使用Powershell脚本代码启动/停止iis和mssql 意味着当我运行ps脚本时,我想启动/停止iis和mssql 我在网上搜索了它,发现了一些代码,但按照我的要求无法正常工作 码: $ii
我在 liferay 工作。我们在我们的项目中使用一个模块来创建 liferay 主题。我使用命令 ant -Ddeploy.war=true 将它部署在服务器中。 war 文件在 liferay 部
我想在已安装 Python 2.7 的 Windows XP 计算机上运行 IPython(版本 0.12)。 我通过 Windows 二进制安装程序安装,但安装后 IPython 没有显示在菜单中,
我从创建了自己的简单图片。 FROM python:2.7.11 RUN mkdir /extra/later/ \ && mkdir /yyy 现在,我可以执行以下步骤: docker run
$(document).ready(function () { setTimeout(function() { window.location.reload(); }, 2000); // 2
我刚刚创建了一个帐户 OpenWeatherMap 我想通过城市 ID API 调用获取当前位置的天气: http://api.openweathermap.org/data/2.5/weather?
我注意到,如果我更改 xcasset 中的图像,启动 Storyboard不会更新。 例如,假设您的启动 Storyboard中有一个 UIImage View ,其中包含一个名为“logo”的蓝色图
我是一名优秀的程序员,十分优秀!