当您通常想要在Android中添加AppWidget时,有一个列表,您需要选择一个小部件并将其绑定到主屏幕.
我正在尝试构建一个app,它有自己的appWidgetHost和我为它构建的特定App Widgets.
我有两个问题:
简单来说; 我的AppWidgets有我的应用程序,我希望完全控制将appWidget绑定到appWidgetHost等.
3人在Google论坛中提出了类似的问题:
我发现可能的唯一答案是链接号2.Paraneet(其中一个回复者)说你可以在/ system/app下安装应用程序而不是/ data/app,因为有些安全问题.但我不确定它是否是一种可靠的生产解决方案,我想更多地了解这样做的优点和缺点.
谢谢,Shai.
我有一个从appwidgetprovider扩展的appwidget.
我创建了一个名为main_layout.xml的布局xml文件并添加了一个按钮.如果我开发了listActivity,我会使用以下路径到达此按钮:R.layout.main_layout.button01.
(Button)findViewById(R.layout.main_layout.button01)
Run Code Online (Sandbox Code Playgroud)
Activity类有一个名为findViewById()的成员方法,但appwidgetprovider却没有.
如何在布局中找到我的按钮?
对不起我的英语不好
我在网上/书中读到了一些关于App Widget的例子,更新小部件的正常例子是onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds)AppWidgetProvider的方法,如下所示:
final int N = appWidgetIds.length;
for (int i=0; i<N; i++) {
int appWidgetId = appWidgetIds[i];
RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.mywidget_layout);
updateViews.setTextViewText(R.id.mytext, "updated text");
appWidgetManager.updateAppWidget(appWidgetId, updateViews);
}
Run Code Online (Sandbox Code Playgroud)
它会循环更新每个小部件.
但是现在,我必须实现一个App Widget,它在BroadcastReceiver onReceive(Context context, Intent intent)方法中更新,因为没有传入int [] appWidgetIds.所以我实现了这样的代码:
RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.mywidget_layout);
updateViews.setTextViewText(R.id.mytext, "updated text");
ComponentName myComponentName = new ComponentName(context, AndroidBatteryWidgetProvider.class);
AppWidgetManager manager = AppWidgetManager.getInstance(context);
manager.updateAppWidget(myComponentName, updateViews);
Run Code Online (Sandbox Code Playgroud)
它没有逐个更新小部件,但实际上所有小部件都立即更新.即使它按我的意愿工作,但我很困惑为什么不需要像以前一样逐个更新所有小部件.
两种方法有什么区别?
我可以发送另一个广播BroadcastReceiver.onReceive()来触发AppWidgetProvider.onUpdate()吗?怎么样?
我创建了一个应用程序(https://play.google.com/store/apps/details?id=com.widget.analytics),该应用程序使用AppWidget在Android主屏幕上显示一个Google Analytics统计信息.
不幸的是,在将应用程序升级到新版本后,用户需要删除之前创建的所有小部件,并且必须再次安装它们.这非常烦人.然而,我确信有办法解决问题.
升级应用程序后,小部件不会被销毁,它们只是处于"默认"状态,它们从布局继承.
我可以用来更新小部件的四个小部件回调中的任何一个吗?有没有我可以采取行动并更新小部件的后级调用回调?
通过谷歌搜索这个问题,我无法弄清楚或找到解决方案.我有一个appwidget的Android应用程序,看起来像http://www.livescorewidget.eu/img/screendumps/widget.png,我正在动态添加数据行.由于设备不同,窗口小部件的高度不同,因此我的行可以使用不同的空间量.我想知道我的小部件使用了多少倾角或像素,所以我可以计算有多少行有空间.可能吗?
如果您可以计算行的布局中可用的高度,那就更好了.
谢谢
我正在开发的启动,我现在用的应用小部件的工作,我跟着从这里教程: AppWigetHost tutrial -莱昂纳多菲舍尔 一切顺利,直到我试图在AppWidgetHostView加入onLongCick监听器
private void createAppWidget(Intent data) {
Bundle extras = data.getExtras();
final int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID);
AppWidgetProviderInfo appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appWidgetId);
AppWidgetHostView hostView = mAppWidgetHost.createView(getApplicationContext(), appWidgetId, appWidgetInfo);
hostView.setAppWidget(appWidgetId, appWidgetInfo);
LinearLayout.LayoutParams params = createLayoutParams(appWidgetInfo);
rootLayout.addView(hostView, params);
hostView.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
Toast.makeText(getApplicationContext(), "Long click " + appWidgetId, Toast.LENGTH_LONG).show();
return true;
}
});
}
Run Code Online (Sandbox Code Playgroud)
当我在主机上添加一个小部件(默认的谷歌模拟时钟) - 并试图长时间点击它,它只是不起作用!长按后,它只会打开时钟应用程序(单击的默认操作).
谁能告诉我如何解决它?这是我的完整代码:http: //pastebin.com/61TkuLvx
添加
我刚刚再次检查:
----如果我长时间点击Clock小部件的边界,则会触发longClick事件!
----我添加了我的自定义appwidget(没有onclick处理程序):所以longclick事件总是被正确触发.
所以我想,它必须与touchevent处理程序/调度程序有关.
添加 我刚刚尝试在主机视图的所有子项上设置onLongClick,如下所示:
private void createAppWidget(Intent data) {
...
...
setChildrenViewLongClick(hostView, …Run Code Online (Sandbox Code Playgroud) 请在回答前完整阅读问题!
假设我有两个观点:
first (黄色)在底部second (青色)填充上面的其余视图 first父视图的大小是动态的.
当父高度动态设置为第一列中的值时,如何实现以下预期列UI?请注意部分可见视图是如何隐藏而不是裁剪的.

second.setVisibility(second.getHeight() < SECONDS_PREFERRED_SIZE? GONE : VISIBLE)
但是我没有访问权限,getHeight()所以解决方案必须是裸xml.RemoteViews.FrameLayout,LinearLayout,RelativeLayout,GridLayoutViewFlipper,ListView,GridView,StackView或者AdapterViewFlipperlayout_width和layout_height是动态的layout_height更改为模拟我想要处理的可能性的显示值.TextView,但它应该普遍适用于任何ViewRemoteViews.我尝试使用RelativeLayout和实现LinearLayout,但它们都表现为图片上的实际列.
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android" …Run Code Online (Sandbox Code Playgroud) android android-widget android-layout android-linearlayout android-appwidget
当添加Widget时,Launcher在Android Lollipop上崩溃,发出以下消息(在以前的Android版本上运行正常):
编辑:这只发生在横向方向.
12-16 12:35:10.208: E/AndroidRuntime(960):
java.lang.RuntimeException: Unable to resume activity {com.android.launcher/com.android.launcher2.Launcher}: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=5, result=-1, data=Intent { (has extras) }} to activity {com.android.launcher/com.android.launcher2.Launcher}: java.lang.NullPointerException: Attempt to read from field 'android.content.pm.ActivityInfo
android.appwidget.AppWidgetProviderInfo.providerInfo' on a null object reference
12-16 12:35:10.208: E/AndroidRuntime(960): at
android.appwidget.AppWidgetHostView.getRemoteContext(AppWidgetHostView.java:465)
12-16 12:35:10.208: E/AndroidRuntime(960): at
android.appwidget.AppWidgetHostView.updateAppWidget(AppWidgetHostView.java:376)
12-16 12:35:10.208: E/AndroidRuntime(960): at com.android.launcher2.LauncherAppWidgetHostView.updateAppWidget(LauncherAppWidgetHostView.java:54)
12-16 12:35:10.208: E/AndroidRuntime(960): at android.appwidget.AppWidgetHost.createView(AppWidgetHost.java:325)
12-16 12:35:10.208: E/AndroidRuntime(960): at com.android.launcher2.Launcher.completeTwoStageWidgetDrop(Launcher.java:703)
12-16 12:35:10.208: E/AndroidRuntime(960): at com.android.launcher2.Launcher.onActivityResult(Launcher.java:664)
Run Code Online (Sandbox Code Playgroud)
这是提供商信息:
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="201dp"
android:minHeight="201dp"
android:updatePeriodMillis="180000"
android:initialLayout="@layout/appwidget_week" …Run Code Online (Sandbox Code Playgroud) 我正在一个项目中工作,我需要在Notification栏的Remoteview中使用ViewFlipper视图.目前我正面临着showNext()和showPreview()的问题.但不幸的是,当我调用按钮时,不会调用showNext()和showPreview().我也发布了我的代码供您参考.如果我的问题不明确,请帮助我在哪里犯错误并纠正我.
private Notification setCustomViewNotification() {
// Creates an explicit intent for an ResultActivity to receive.
Intent resultIntent = new Intent(this, ResultActivity.class);
// This ensures that the back button follows the recommended convention for the back key.
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
// Adds the back stack for the Intent (but not the Intent itself)
stackBuilder.addParentStack(ResultActivity.class);
// Adds the Intent that starts the Activity to the top of the stack.
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
// Create remote view and set …Run Code Online (Sandbox Code Playgroud) notifications android viewflipper android-appwidget android-remoteview
我正在开发我的第一个应用程序小部件。除了一件事情,一切都很好。我找不到,如何使用Glide在RemoteViewsFactroy的getViewAt()方法中将图像加载到ImageView中。我总是遇到错误,因为我不得不在MainThread上遇到(AppWidgetTarget),但是我无法从RemoteViewsFactory调用新的Handler(Looper.getMainLooper())。