我有一个适用于 android 的应用程序,我已经在 lollipop 之前为它制作了一个 appwidget,由于某些原因,该小部件没有出现在 lollipop 中。然而,它出现在前 Lollipop 设备中。
这是我的代码:
AndroidManifest.xml
<receiver android:name=".widgets.NewsWidgetProvider"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >>
<intent-filter >
<action
android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/news_info" />
</receiver>
新闻信息.xml
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider
xmlns:android="http://schemas.android.com/apk/res/android"
android:initialLayout="@layout/widget_news"
android:minHeight="72dp"
android:minWidth="300dp"
android:updatePeriodMillis="6000000" >
NewsWidgetProvider.java
public class NewsWidgetProvider extends AppWidgetProvider {
private static final String NEXT_NEWS = "NEXT_NEWS";
private static final String PREVIOUS_NEWS = "PREVIOUS_NEWS";
private static final String GO_TO_NEWS_ACTIVITY = "GO_TO_NEWS_ACTIVITY";
private final String NEWS_LIST_KEY = "newsList";
NewsItem[] news;
int currentNews=0;
Bitmap imageBitmap;
private final String CURRENT_NEWS_KEY = "currentNews";
@Override
public void onUpdate(final Context context, AppWidgetManager appWidgetManager, final int[] appWidgetIds) {
startService(context);
loadItemFromSharedPreference(context);
for (int widgetId : appWidgetIds) {
setUpView(context, appWidgetManager, appWidgetIds, widgetId);
}
}
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
loadItemFromSharedPreference(context);
if (news != null) {
if (GO_TO_NEWS_ACTIVITY.equals(intent.getAction())){
openNewsActivity(context);
}
else if (NEXT_NEWS.equals(intent.getAction())) {
if (currentNews == news.length - 1) {
Toast.makeText(context, "reached last news", Toast.LENGTH_SHORT).show();
}
else if (news.length - 1 > currentNews) {
currentNews++;
SharedPreferencesManager.putInteger(context, CURRENT_NEWS_KEY, currentNews);
loadItemFromSharedPreference(context);
setTheCurrentView(context);
}
}
else if (PREVIOUS_NEWS.equals(intent.getAction())) {
if (currentNews == 0) {
Toast.makeText(context, context.getString(R.string.last_item), Toast.LENGTH_SHORT).show();
}
else if (currentNews > 0 && news != null) {
currentNews--;
SharedPreferencesManager.putInteger(context, CURRENT_NEWS_KEY, currentNews);
loadItemFromSharedPreference(context);
setTheCurrentView(context);
}
}
}
}
private void setUpView(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds, int widgetId) {
final RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
R.layout.widget_news);
remoteViews.setTextViewText(R.id.title, news==null?context.getString(R.string.wait_msg):news[currentNews].title);
remoteViews.setTextViewText(R.id.brief,news==null?"":news[currentNews].brief);
setPendingIntents(context, appWidgetIds, remoteViews);
if (news!=null) {
if (imageBitmap!=null) {
AQuery aq = new AQuery(context);
remoteViews.setImageViewBitmap(R.id.image, aq.getCachedImage(news[currentNews].imageUrl, 100));
}
else {
remoteViews.setImageViewResource(R.id.image,R.drawable.ic_launcher);
}
}
else {
remoteViews.setImageViewResource(R.id.image,R.drawable.ic_launcher);
}
appWidgetManager.updateAppWidget(widgetId, remoteViews);
}
private void setTheCurrentView(Context context) {
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
R.layout.widget_news);
remoteViews.setTextViewText(R.id.title, news==null?context.getString(R.string.widget_problem_title):news[currentNews].title);
remoteViews.setTextViewText(R.id.brief,news==null?context.getString(R.string.widget_problem_breif):news[currentNews].brief);
remoteViews.setImageViewBitmap(R.id.image, imageBitmap);
ComponentName thisWidget = new ComponentName( context, NewsWidgetProvider.class );
AppWidgetManager.getInstance(context).updateAppWidget( thisWidget, remoteViews );
}
private void openNewsActivity(Context context) {
Intent o=new Intent(context, NewsActivity.class);
o.putExtra(NewsItem.EXTRA_NEWS_ITEM,news[currentNews]);
o.putExtra(NewsItem.EXTRA_NEWS_SOURCE_IS_PUSH_OR_WIDGET,true);
o.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(o);
}
private void setPendingIntents(Context context, int[] appWidgetIds, RemoteViews remoteViews) {
remoteViews.setOnClickPendingIntent(R.id.next_news, getPendingSelfIntent(context, NEXT_NEWS, appWidgetIds));
remoteViews.setOnClickPendingIntent(R.id.previous_news,getPendingSelfIntent(context,PREVIOUS_NEWS,appWidgetIds));
remoteViews.setOnClickPendingIntent(R.id.title,getPendingSelfIntent(context,GO_TO_NEWS_ACTIVITY,appWidgetIds));
remoteViews.setOnClickPendingIntent(R.id.brief,getPendingSelfIntent(context,GO_TO_NEWS_ACTIVITY,appWidgetIds));
remoteViews.setOnClickPendingIntent(R.id.image,getPendingSelfIntent(context,GO_TO_NEWS_ACTIVITY,appWidgetIds));
}
protected PendingIntent getPendingSelfIntent(Context context, String action,int[] appWidgetIds) {
Intent intent = new Intent(context, getClass());
intent.setAction(action);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context,
0, intent, 0);
return pendingIntent;
}
private void loadItemFromSharedPreference(Context context) {
currentNews=SharedPreferencesManager.getInteger(context, CURRENT_NEWS_KEY, 0);
news=SharedPreferencesManager.getObject(context, NEWS_LIST_KEY,NewsItem[].class);
AQuery aq = new AQuery(context);
imageBitmap= news == null ? BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher) : aq.getCachedImage(news[currentNews].imageUrl,200);
}
private void startService(Context context) {
Intent broadcastIntent = new Intent(context, NewsWidgetService.class );
//only start service if news is null
if (SharedPreferencesManager.getObject(context, NEWS_LIST_KEY, NewsItem[].class)==null)
context.startService(broadcastIntent);
}
代码在 (kitkat,jelly...) 中有效,但在 lollipop 中无效
我错过了什么吗?
最佳答案
我遇到了同样的问题 - 我通过向 appwidget-provider 添加额外的参数 android:widgetCategory="home_screen" 来修复它:
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="294dp"
android:minHeight="40dp"
android:updatePeriodMillis="86400000"
android:configure="com.example.activities.ConfigurationActivity"
android:previewImage="@drawable/ic_launcher"
android:initialLayout="@layout/widget_layout"
android:widgetCategory="home_screen"
android:resizeMode="none">
</appwidget-provider>
关于android - appWidget 仅在 Lollipop 设备的启动器小部件列表中不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28983263/
我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib
我试图在索引页中创建一个超链接,但它没有显示,也没有给出任何错误。这是我的index.html.erb代码。ListingarticlesTitleTextssss我检查了我的路线,我认为它们也没有问题。PrefixVerbURIPatternController#Actionwelcome_indexGET/welcome/index(.:format)welcome#indexarticlesGET/articles(.:format)articles#indexPOST/articles(.:format)articles#createnew_articleGET/article
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
我刚刚按照thebootsygempage上的安装说明进行操作在我保存并查看帖子内容之前,一切看起来都不错。这是输出在View中的样子:HeaderSubhead:似乎没有呈现任何html格式,因为它被引号或类似的东西转义了-其他人有这个问题吗?我没有在github页面或SO上看到任何问题来指出我正确的方向。除了遵循gem安装说明之外,我还没有做任何事情,但也许我错过了什么或者只是犯了一个愚蠢的错误。如果你还有什么想知道的,请尽管问。干杯 最佳答案 你需要有这样的东西,转义html: 关
我正在写一篇关于在Ruby中几乎一切都是对象的博客文章,我试图通过以下示例来展示这一点:classCoolBeansattr_accessor:beansdefinitialize@bean=[]enddefcount_beans@beans.countendend所以从类中我们可以看出它有4个方法(当然,除非我错了):它可以在创建新实例时初始化一个默认的空bean数组它可以计算它有多少个bean它可以读取它有多少个bean(通过attr_accessor)它可以向空数组写入(或添加)更多bean(也通过attr_accessor)但是,当我询问类本身它有哪些实例方法时,我没有看到默认
Devise是一个Ruby库,它为我提供了这个User类:classUser当写入:confirmable时,注册时会发送一封确认邮件。上周我不得不批量创建300个用户,所以我在恢复之前注释掉了:confirmable几分钟。现在我正在为用户批量创建创建一个UI,因此我需要即时添加/删除:confirmable。(我也可以直接修改Devise的源码,但我宁愿不去调和它)问题:如何即时添加/删除:confirmable? 最佳答案 WayneConrad的解决方案:user=User.newuser.skip_confirmation
关于这个有很多问题,但似乎都没有帮助。是的,我看过thisrailscast.我有一个作者,他有很多书,像这样:作者:classAuthor书:classBook我创建了以下表单以在authors#show中向作者添加一本书:#labelsandbuttons......使用以下authors_controller方法:defshow@author=Author.find(params[:id])@book=@author.books.buildend...以及以下books_controller方法:defcreate@author=Author.find(params[:autho
我需要formtastic来仅显示月份和年份字段,而不显示日期字段。日期选择器很好,但它显示了整个日历。我不想要日期选择器。f.input:accounting_month,:label=>"会计月份",:as=>:datepicker我只需要月份和年份。 最佳答案 有一种方法可以做到这一点:"Accountingmonth",:order=>[:month,:year]这将自动隐藏“天”输入并为其指定默认值1。 关于ruby-on-rails-Rails3Formtastic。如何让f
我有一个类unzipper.rb,它使用Rubyzip解压文件。在我的本地环境中,我可以成功解压缩文件,而无需使用require'zip'明确包含依赖项但是在Heroku上,我得到一个NameError(uninitializedconstantUnzipper::Zip)我只能通过使用明确的require来解决问题:为什么这在Heroku环境中是必需的,但在本地主机上却不是?我的印象是Rails自动需要所有gem。app/services/unzipper.rbrequire'zip'#OnlyrequiredforHeroku.Workslocallywithout!class