如何在Widget上动态添加元素上设置LayoutParams

时间:2011-09-10 20:45:45

标签: java android android-layout

目前,我正在使用以下内容动态地向我的窗口小部件添加元素:

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更多

3 个答案:

答案 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