我需要在Android AppWidget中确定运行时的屏幕密度.我已经设置了一个HDPI仿真器设备(avd).如果设置了常规可执行项目,并将此代码插入onCreate方法:
DisplayMetrics dm = getResources().getDisplayMetrics();
Log.d("MyTag", "screen density " + dm.densityDpi);
Run Code Online (Sandbox Code Playgroud)
这按预期输出"屏幕密度240".
但是,如果我设置了一个AppWidget项目,并将此代码插入onUpdate方法:
DisplayMetrics dm = context.getResources().getDisplayMetrics();
Log.d("MyTag", "screen density " + dm.densityDpi);
Run Code Online (Sandbox Code Playgroud)
这输出"屏幕密度160".我注意到,连接调试器,这里的Resources对象的mDefaultDisplay成员在AppWidget案例中为null.
类似地,如果我在运行时使用从AppWidget中的context.getResources()获得的Resources对象获取资源,它将根据屏幕密度返回错误的资源.例如,我有一个60x60px可绘制的mdpi,以及一个80x80可绘制的hdpi.如果我使用context.getResources().getDrawable(...)获取此Drawable对象,则返回60x60版本.
有没有办法在运行时从AppWidget的上下文正确处理资源?
谢谢!
我有一个简单的appwidget,我想在活动中发生动作时(在同一个应用程序中)更新它.在onUpdate()中,我立即更新小部件,工作正常.在我的活动中,我在appUidget中调用相同的静态更新方法,该方法在onUpdate()中调用以更新视图.小部件未更新.
我可以将代码直接跟踪到AppWidgetManager.updateAppWidget()方法中,这一切都很好,但是小部件不会更新.
我能看到的唯一可能的区别是,当从活动的上下文调用appwidget的onUpdate()方法的上下文时,传递给我的静态更新方法的上下文对象是不同的.但是,网上有很多这样的例子,所以我希望它能够起作用.
我在AppWidget中更新RemoteView时出现错误.
.. !!! 失败的粘合剂交易!
这是因为对RemoteViews的所有更改都是序列化的(例如setInt和setImageViewBitmap).位图也被序列化为内部包.不幸的是,这个捆绑包的尺寸限制非常小.
我不能使用setImageResource,因为我希望允许用户下载小部件的外观.
任何人都可以为此问题推荐解决方法吗?我已经为窗口小部件的每个实例使用了"新的"RemoteViews对象,但是单个实例包含太多更新.
谢谢!
我为我的应用创建了一个很好的广角.它只显示从服务器下载的项目列表.嗯,确切地说,它看起来只是一个列表,因为较旧的Android版本(我想支持)不支持RemoteViews中的ListView.
我希望我的小部件显示最新项目列表,我希望这些项目占用所有可用的小部件空间.为了更好地展示我的问题,以免假设WLOG我想要一个具有所选节目的电视节目表的小部件.知道:
如果用户将调整大小以使其更大,我如何确保小部件底部不会有空白空间?我搜索了SO,似乎当用户更改小部件大小时(在ICS或自定义启动器上 - GO Launcher EX允许它),获取小部件的新维度是不可能的(纠正我,如果我错了).
但我真的不需要它们!我想知道有多少项适合小部件,从小部件的大小计算这只是方法之一.
所以,我问你是否有可能,例如,如果远程视图变得可见,或者创建自定义视图以便在RemoteViews中使用,这将允许我估计可见项目的数量.
如果不可能,我将只需要使用一些合理的默认值,但知道我可以显示多少行会很好.
基本上我想做的是将一个自定义的parcelable对象通过intent传递给RemoteViewsService,从而传递给我的RemoteViewsFactory.出于某种原因,这根本不起作用:S每当我尝试这样做时,小部件最终会显示"问题加载小部件"文本.
当我尝试相同的事情,但我没有将它传递给RemoteViewsService,而是将其传递给常规Activity,它完全按预期工作.
我试图在网上找到我的答案,但我一直没有成功,因此我现在发帖在这里希望得到帮助.
我一直试图让这个在我的主程序中运行一段时间.但我无法弄明白.所以我试着将它煮沸,看看我是否在某种程度上做错了什么.我成功地重新创建了这个问题,我重新创建问题的基础来自CommonsGuy的LoremWidget(https://github.com/commonsguy/cw-advandroid/tree/master/AppWidget/LoremWidget)和一个随机的可以说明的例子(http ://prasanta-paul.blogspot.dk/2010/06/android-parcelable-example.htm l)我已经修改过以显示我的问题.(希望我不会遇到麻烦,在这两个链接上使用了代码)
下面是随机文件主机上传的完整代码,以防有人想要测试我正在谈论的内容:http: //www.filedropper.com/remoteviewserviceparcelerrorexample
总结一下我的问题:
为什么我不能将我的parcelable对象(单独或包装在ArrayList中)传递给我的RemoteViewsService?(当相同的代码与Activity一起工作时)
我真的希望有人能够帮助我.现在,在我的主程序中,我将序列化到内部存储,然后从RemoteViewsService再次反序列化,之后我已经阅读了所有内容,这是非常有效的!
编辑:记住,由于某种原因,在我的主程序中,如果我传递一个自定义对象,将ArrayList和Strings设置为null,并将布尔值全部设为false(基本上是对象在创建时的外观),小部件看起来很正常(即没有"问题加载小部件"消息).
编辑:看了一下外观(没有过滤到我正在运行的应用程序)我现在看到一些错误(猜测我最好学会在未获得任何文件的情况下将其全部未过滤:) :):
11-13 17:14:27.268: D/AndroidRuntime(8840): >>>>>> AndroidRuntime START com.android.internal.os.RuntimeInit <<<<<<
11-13 17:14:27.268: D/AndroidRuntime(8840): CheckJNI is ON
11-13 17:14:27.340: D/AndroidRuntime(8840): Calling main entry com.android.commands.pm.Pm
11-13 17:14:27.348: W/ActivityManager(90): No content provider found for permission revoke: file:///data/local/tmp/com.commonsware.android.appwidget.lorem.LoremActivity.apk
11-13 17:14:27.348: W/ActivityManager(90): No content provider found for permission revoke: file:///data/local/tmp/com.commonsware.android.appwidget.lorem.LoremActivity.apk
11-13 17:14:27.356: I/PackageManager(90): Removing non-system package:com.commonsware.android.appwidget.lorem
11-13 17:14:27.360: I/ActivityManager(90): Force stopping package com.commonsware.android.appwidget.lorem uid=10034
11-13 17:14:27.360: I/ActivityManager(90): Killing …Run Code Online (Sandbox Code Playgroud) 我使用我的应用程序的集合创建了一个应用程序小部件,该小部件显示该特定日期的日期和项目列表.一切正常,窗口小部件正在根据需要进行更新.但有时,通过单击下一个和上一个按钮更改窗口小部件中的日期时会发生什么,列表不刷新意味着项目在该特定日期未更新.此行为是随机的,有时仅发生.那么为什么会发生这种情况,我的代码中有任何错
我使用的代码是:
WidgetProvider.class
public class WidgetProvider extends AppWidgetProvider
{
private ThemeManager m_ThemeManagerObject;
private static String WIDGET_NEXT_BUTTON = "in.test.widgetApp.WIDGET_NEXT_BUTTON";
private static String WIDGET_PREV_BUTTON = "in.test.widgetApp.WIDGET_PREV_BUTTON";
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
{
super.onUpdate(context, appWidgetManager, appWidgetIds);
// Set Date to current Date
NoteManager.getSingletonObject().setWidgetToCurrentDate();
// Code to update the widget by current date
updateAppWidget(context, AppWidgetManager.getInstance(context), appWidgetIds);
}
@Override
public void onReceive(Context context, Intent intent)
{
super.onReceive(context, intent);
int numOfDays = 1;
ComponentName thisWidget = new ComponentName(context, WidgetProvider.class);
AppWidgetManager appWidgetManager = …Run Code Online (Sandbox Code Playgroud) 我的应用程序托管用户安装的小部件,与启动器应用程序相同.
一旦我绑定小部件,一切正常.窗口小部件创建,自动更新,我可以单击以导航内部视图.
一切都工作正常,直到我从Play商店更新我的应用程序(或手动使用签名的APK).
更新后,小部件仍然显示但不再更新.一些小部件在我点击它们时起作用,但是视图被卡住并且永远不会更新,直到我重新创建小部件(获取新ID并绑定它).
我尝试使用强制更新
Intent intent = new Intent();
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
intent.setComponent(appWidgetInfo.provider);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[]
{appWidgetId});
context.sendBroadcast(intent);
Run Code Online (Sandbox Code Playgroud)
但这没有帮助......
我想尝试点击强制更新,但我找不到任何方法来获取小部件的RemoteViews(因为这不是我的小部件,我只是托管它).
RemoteViews views =
new RemoteViews(context.getPackageName(),R.layout.mywidget_layout);
Intent updateIntent = new Intent();
updateIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
updateIntent.putExtra(myWidgetProvider.WIDGET_IDS_KEY, ids);
PendingIntent pendingIntent = PendingIntent.getBroadcast(
context, 0, updateIntent, PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.view_container, pendingIntent);
Run Code Online (Sandbox Code Playgroud)
还实现了一个AppWidgetProvider监听小部件的ID更改(APPWIDGET_HOST_RESTORED),但它不会在我的应用程序更新时调用.
我的下一步是在应用程序更新后重新创建所有小部件,但我真的不愿意这样做.
非常感谢任何帮助!
窗口小部件是Android本机构造,用于在应用程序屏幕上扩展视图.
是否可以使用Ionic构建主屏幕小部件或反应原生?
android-widget android-appwidget ionic-framework react-native
我的小部件由2个按钮和一个显示数据的列表视图组成.大多数情况下,当调用窗口小部件提供程序的onUpdate方法时,一切都正常加载,每个人都很高兴.
但是我注意到有时在调用update方法之后,widget完全无法加载其数据.列表视图为空,并且所有按钮都没有响应.就像我将布局初始化到窗口小部件中一样,但没有设置挂起的意图和列表的适配器.
我记录了一切,发现事实并非如此.每次都会创建挂起的意图,以及列表适配器,包括失败时的随机时间.很长一段时间以来,我认为它与列表数据如何填充到适配器中有关,但每次都看到它工作,再加上按钮意图不能正常工作的事实让我相信方法updateAppWidget (ComponentName,RemoteViews)是失败的.但是,没有错误堆栈可以帮助我确认这一点.
以下是在AppWidgetProvider的onUpdate方法调用的单独服务中运行的代码:
@SuppressWarnings("deprecation")
private void updateWidget(int[] ids) {
AppWidgetManager widgetManager = AppWidgetManager.getInstance(this);
int[] widgetIds = widgetManager.getAppWidgetIds(new ComponentName(this, WidgetReceiver.class));
for (int currentWidgetId : widgetIds) {
RemoteViews widget = new RemoteViews(this.getPackageName(), R.layout.widget_layout);
Intent intent = new Intent(this, WidgetService.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, currentWidgetId);
intent.putExtra("random", randomNumber);
randomNumber++;
intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
widget.setRemoteAdapter(currentWidgetId, android.R.id.list, intent);
Intent clickIntent = new Intent(this, DetailsActivity.class);
PendingIntent pending = PendingIntent.getActivity(this, 0, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT);
widget.setPendingIntentTemplate(android.R.id.list, pending);
Intent settingsIntent = new Intent(this, WidgetSettingsActivity.class);
settingsIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
settingsIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent settingsPending = PendingIntent.getActivity(this, 0, settingsIntent, PendingIntent.FLAG_UPDATE_CURRENT);
widget.setOnClickPendingIntent(R.id.widget_settings, settingsPending); …Run Code Online (Sandbox Code Playgroud) 我可以AppWidgetHost在里面使用Fragment吗?我无法将大多数小部件添加到我的AppWidgetHost中进行更新.这是我的情景..
LauncherActivity.java
main.xml中
CodeRedWidgetHostFragment.java
onCreateView
创建AppWidgetHost和AppWidgetManager的实例
创建并设置我的主机视图,其中包含我存储在首选项中的小部件ID
onStart()
appWidgetHost.startListening()
onStop()
appWidgetHost.stopListening()
当我得到AppWidgetHost和AppWidgetManager的实例时,我正在使用getActivity()来获取Fragments托管活动.我想知道这是不是我的小部件没有更新的原因?
有些小部件实际上会更新,例如模拟时钟,但是,Youtube小部件不会自动循环显示视频缩略图.
我应该提一下,我在AppWidgetHost中选择了我想要的小部件,在另一个活动中将所选小部件的id存储在SharedPreferences中.
这是我的Fragment类的代码.
package com.brockoli.android.codered.widgethost;
import android.app.Fragment;
import android.appwidget.AppWidgetHost;
import android.appwidget.AppWidgetHostView;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProviderInfo;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.brockoli.android.codered.R;
public class CodeRedWidgetHostFragment extends Fragment {
private static final String TAG = CodeRedWidgetHostFragment.class.getSimpleName();
public static final String CODERED_WIDGET_ID = "CODERED_WIDGET_ID";
private SharedPreferences mSharedPrefsWidgets;
AppWidgetManager mAppWidgetManager;
AppWidgetHost mAppWidgetHost;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup …Run Code Online (Sandbox Code Playgroud) android host android-widget android-fragments android-appwidget