Как установить LayoutParams для динамически добавляемых элементов в виджете - PullRequest
4 голосов
/ 11 сентября 2011

В настоящее время я динамически добавляю элементы в мой виджет, используя следующее:

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-1022: 01: 55.283: ОШИБКА / AndroidRuntime (30060): ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: главная 09-10 22: 01: 55.283: ОШИБКА / AndroidRuntime (30060): java.lang.RuntimeException: Невозможно запустить приемник com.example.test.HomeWidget: java.lang.ClassCastException: android.app.ReceiverRestrictedContext 09-10 22: 01: 55.283: ОШИБКА / AndroidRuntime (30060): в android.app.ActivityThread.handleReceiver (ActivityThread.java:2821) 09-10 22:01:55.283: ОШИБКА / AndroidRuntime (30060): на android.app.ActivityThread.access $ 3200 (ActivityThread.java:125) 09-10 22: 01: 55.283: ОШИБКА / AndroidRuntime (30060): на android.app.ActivityThread $ H.handleMessage (ActivityThread.java:2083) 09-10 22: 01: 55.283: ОШИБКА / AndroidRuntime (30060): на android.os.Handler.dispatchMessage (Handler.java:99) 09-10 22: 01: 55.283: ОШИБКА / AndroidRuntime (30060): на android.os.Looper.loop (Looper.java: 123) 09-10 22: 01: 55.283: ОШИБКА / AndroidRuntime (30060): на android.app.ActivityThread.main (ActivityThread.java:4627) 09-10 22: 01: 55.283: ОШИБКА / AndroidRuntime (30060): at java.lang.reflect.Method.invokeNative (собственный метод) 09-10 22: 01: 55.283: ОШИБКА / AndroidRuntime (30060): at java.lang.reflect.Method.invoke (Method.java:521) 09-10 22: 01: 55.283: ОШИБКА / AndroidRuntime (30060): на com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:858) 09-10 22: 01: 55.283: ОШИБКА / AndroidRuntime (30060): at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:616) 09-10 22: 01: 55.283: ОШИБКА / AndroidRuntime (30060): в dalvik.system.NativeStart.main (собственный метод) 09-10 22: 01: 55.283: ОШИБКА / AndroidRuntime (30060): вызвано: java.lang.ClassCastException: android.app.ReceiverRestrictedContext 09-10 22: 01: 55.283: ОШИБКА / AndroidВремя выполнения (30060): на com.example.test.HomeWidget.onUpdate (HomeWidget.java:37) 09-10 22: 01: 55.283: ОШИБКА / AndroidRuntime (30060): на android.appwidget.AppWidgetProvider.onReceive (AppWidgetProvider.java: 61) 09-10 22: 01: 55.283: ОШИБКА / AndroidRuntime (30060): на android.app.ActivityThread.handleReceiver (ActivityThread.java:2810) 09-10 22: 01: 55.283: ОШИБКА / AndroidRuntime (30060):... еще 10

Ответы [ 3 ]

2 голосов
/ 20 января 2012
LinearLayout layoutParams = item.getLayoutParams();
layoutParams.setMargins(10, 50, 4, 5);
item.setLayoutParams(layoutParams);

Каким-то образом создание новых LayoutParams всегда вызывает такую ​​ошибку.Я думаю, что некоторые поля остаются неустановленными.Только скопируйте существующие.

1 голос
/ 11 сентября 2011

Как я уже сказал в комментариях, вы пытаетесь привести context к Activity. Этот контекст не Activity. От AppWidgetProvider.onReceive():

context Context, в котором работает приемник.

Кроме того, вы не можете получить доступ к Activity из виджета.

Если вы хотите вызвать Activity из виджета, вы должны зарегистрировать BroadcastReceiver в этом Activity и вызвать его, используя Context.sendBroadcast().

РЕДАКТИРОВАТЬ : И если вы хотите установить LayoutParams для RemoteViews, вам лучше сделать это в XML.

0 голосов
/ 11 сентября 2011

У меня есть метод, чтобы изменить нижнее поле любого вида для любого количества пикселей.Вы можете пойти дальше и сделать его более универсальным для верхнего, правого и левого полей.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...