Cómo establecerLayoutParams en elementos añadidos dinámicamente en Widget

Actualmente, estoy agregando elementos dinámicamente a mi widget usando lo siguiente:

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); 

Pero ¿cómo puedo agregar dinámicamente márgenes, pesos y otras propiedades a los elementos agregados?

Actualmente he intentado (usando el código que he encontrado de diversos sitios):

 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); 

Pero esta fuerza se cierra

LogCat:

09-10 22: 01: 55.283: ERROR / AndroidRuntime (30060): EXCEPCIÓN FATAL: principal 09-10 22: 01: 55.283: ERROR / AndroidRuntime (30060): java.lang.RuntimeException: No se puede iniciar com.example receptor. Test.HomeWidget: java.lang.ClassCastException: android.app.ReceiverRestrictedContext 09-10 22: 01: 55.283: ERROR / AndroidRuntime (30060): en android.app.ActivityThread.handleReceiver (ActivityThread.java:2821) 09-10 22 : 01: 55.283: ERROR / AndroidRuntime (30060): en android.app.ActivityThread.access $ 3200 (ActivityThread.java:125) 09-10 22: 01: 55.283: ERROR / AndroidRuntime (30060): en android.app.ActivityThread $ H.handleMessage (ActivityThread.java:2083) 09-10 22: 01: 55.283: ERROR / AndroidRuntime (30060): en android.os.Handler.dispatchMessage (Handler.java:99) 09-10 22: 01: 55.283 : ERROR / AndroidRuntime (30060): en android.os.Looper.loop (Looper.java:123) 09-10 22: 01: 55.283: ERROR / AndroidRuntime (30060): en android.app.ActivityThread.main (ActivityThread. Java: 4627) 09-10 22: 01: 55.283: ERROR / AndroidRuntime (30060): en java.lang.refle Ct.Method.invokeNative (Método nativo) 09-10 22: 01: 55.283: ERROR / AndroidRuntime (30060): en java.lang.reflect.Method.invoke (Method.java:521) 09-10 22: 01: 55.283 : ERROR / AndroidRuntime (30060): en com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:858) 09-10 22: 01: 55.283: ERROR / AndroidRuntime (30060): en com.android. Internal.os.ZygoteInit.main (ZygoteInit.java:616) 09-10 22: 01: 55.283: ERROR / AndroidRuntime (30060): en dalvik.system.NativeStart.main (Native Method) 09-10 22: 01: 55.283 : ERROR / AndroidRuntime (30060): Causado por: java.lang.ClassCastException: android.app.ReceiverRestrictedContext 09-10 22: 01: 55.283: ERROR / AndroidRuntime (30060): en com.example.test.HomeWidget.onUpdate (HomeWidget .java: 37) 09-10 22: 01: 55.283: ERROR / AndroidRuntime (30060): en android.appwidget.AppWidgetProvider.onReceive (AppWidgetProvider.java:61) 09-10 22: 01: 55.283: ERROR / AndroidRuntime (30060) ): En android.app.ActivityThread.handleReceiver (ActivityThread.java:2810) 09-10 22: 01: 55.283: ERROR / AndroidRun Tiempo (30060): … 10 más

 LinearLayout layoutParams = item.getLayoutParams(); layoutParams.setMargins(10, 50, 4, 5); item.setLayoutParams(layoutParams); 

De alguna manera crear nuevos LayoutParams siempre causa ese error. Creo que quedan algunos campos sin configurar. Sólo copie los existentes.

Como ya he dicho en los comentarios, estás intentando darle context a Activity . Este contexto no es Activity . Desde AppWidgetProvider.onReceive() :

context Context en el que se está ejecutando el receptor.

Además, no puedes acceder a una Activity desde un widget.

Si desea llamar a una Activity de un widget, debe registrar un BroadcastReceiver en esta Activity y llamarla utilizando Context.sendBroadcast() .

EDIT : Y si desea configurar LayoutParams para RemoteViews , es mejor hacerlo en XML.

Tengo un método para cambiar el margen inferior de cualquier vista para cualquier cantidad de píxeles. Puede seguir adelante y hacer que sea un poco más genérico para los márgenes superior, derecho e izquierdo también.

 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(); } 

Espero que esto ayude,

Siciano

  • Relación uno-a-muchos en ORMLite Android
  • Cadena de confianza de Android SSL con certificados intermedios (Apache HttpClient 4.X)
  • Android: solicitud HTTP de Google Drive
  • Extraer Android .apk y leer el contenido del archivo XML en res / layout
  • Convertir doble en cadena
  • ContentResolver.notifyChange no funciona
  • Qué es stringentity en android y su uso
  • ¿Grabar audio en Android con MediaPlayer como fuente?
  • Android: java.lang.IllegalStateException: Ya conectado
  • Obtenga el valor de RemoteMessage del método FCM onMessageReceived
  • El permiso personalizado de Android falla según el pedido de instalación de la aplicación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.