目前,我正在使用以下内容动态地向我的窗口小部件添加元素:
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_design);
RemoteViews newView = new RemoteViews(context.getPackageName(), R.layout.widget_item);
views.addView(R.id.view_container, newView);
但是如何动态地为添加的元素添加边距,权重和其他属性?
目前我已经尝试过(使用我在不同网站上找到的代码):
LinearLayout item = (LinearLayout) ((Activity) context).findViewById(R.id.widgetItem);
MarginLayoutParams marginParams = new MarginLayoutParams(item.getLayoutParams());
marginParams.setMargins(10, 50, 4, 5);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(marginParams);
item.setLayoutParams(layoutParams);
但是这个强制关闭
logcat的:
09-10 22:01:55.283:ERROR / AndroidRuntime(30060):致命异常:主要 09-10 22:01:55.283:ERROR / AndroidRuntime(30060): java.lang.RuntimeException:无法启动接收器 com.example.test.HomeWidget:java.lang.ClassCastException: android.app.ReceiverRestrictedContext 09-10 22:01:55.283: 错误/ AndroidRuntime(30060):at android.app.ActivityThread.handleReceiver(ActivityThread.java:2821) 09-10 22:01:55.283:ERROR / AndroidRuntime(30060):at android.app.ActivityThread.access $ 3200(ActivityThread.java:125)09-10 22:01:55.283:ERROR / AndroidRuntime(30060):at android.app.ActivityThread $ H.handleMessage(ActivityThread.java:2083) 09-10 22:01:55.283:ERROR / AndroidRuntime(30060):at android.os.Handler.dispatchMessage(Handler.java:99)09-10 22:01:55.283:ERROR / AndroidRuntime(30060):at android.os.Looper.loop(Looper.java:123)09-10 22:01:55.283: 错误/ AndroidRuntime(30060):at android.app.ActivityThread.main(ActivityThread.java:4627)09-10 22:01:55.283:ERROR / AndroidRuntime(30060):at java.lang.reflect.Method.invokeNative(Native Method)09-10 22:01:55.283:ERROR / AndroidRuntime(30060):at java.lang.reflect.Method.invoke(Method.java:521)09-10 22:01:55.283: 错误/ AndroidRuntime(30060):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:858) 09-10 22:01:55.283:ERROR / AndroidRuntime(30060):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)09-10 22:01:55.283:ERROR / AndroidRuntime(30060):at dalvik.system.NativeStart.main(Native Method)09-10 22:01:55.283: ERROR / AndroidRuntime(30060):引起:java.lang.ClassCastException: android.app.ReceiverRestrictedContext 09-10 22:01:55.283: 错误/ AndroidRuntime(30060):at com.example.test.HomeWidget.onUpdate(HomeWidget.java:37)09-10 22:01:55.283:ERROR / AndroidRuntime(30060):at android.appwidget.AppWidgetProvider.onReceive(AppWidgetProvider.java:61) 09-10 22:01:55.283:ERROR / AndroidRuntime(30060):at android.app.ActivityThread.handleReceiver(ActivityThread.java:2810) 09-10 22:01:55.283:ERROR / AndroidRuntime(30060):... 10更多
答案 0 :(得分:2)
LinearLayout layoutParams = item.getLayoutParams();
layoutParams.setMargins(10, 50, 4, 5);
item.setLayoutParams(layoutParams);
以某种方式创建新的LayoutParams总是会导致这样的错误。我想,仍有一些领域未设置。只复制现有的。
答案 1 :(得分:1)
正如我在评论中已经说过的那样,您正试图将context
投射到Activity
。此上下文不是Activity
。来自AppWidgetProvider.onReceive()
:
context
接收器正在运行的Context
。
此外,您无法从小部件访问Activity
。
如果您想通过窗口小部件调用Activity
,则应在此BroadcastReceiver
中注册Activity
并使用Context.sendBroadcast()
进行调用。
编辑:如果你想为LayoutParams
设置RemoteViews
,你最好用XML格式化。
答案 2 :(得分:0)
我有一种方法可以为任意数量的像素更改任何视图的下边距。您可以继续使其在顶部,右侧和左侧边距上更通用。
private static void adjustViewHeight(int resID, int pixels, Activity activity){
((FrameLayout.LayoutParams)activity.findViewById(resID).getLayoutParams()).bottomMargin = pixels;
activity.findViewById(resID).invalidate();
activity.findViewById(resID).requestLayout();
}
希望这有帮助,
-serkan