2012-01-09 10 views
27

Tengo un widget que creé contra Android 2.1 que ha estado bien y vendiendo en el mercado.Android 4.0: ¿widgets no aparecen?

Tuve un usuario quejarse de que lo había comprado y nunca apareció en su dispositivo con Android 4.0.

Cargué el emulador 4.0, lo ejecuté desde Eclipse, informó una instalación exitosa y, de hecho, puedo verlo listado en la aplicación "Vista previa de widgets", y puedo ejecutarlo allí y parece estar bien, pero no aparece en ningún lugar debajo de "Widgets" - ¡No puedo encontrarlo para arrastrarlo a la pantalla de inicio! Supongo que esto es lo mismo que el usuario está viendo.

¿Alguna idea de lo que está pasando aquí? ¿Por qué está bien en 2.1 pero no aparece en la lista en 4.0, incluso después de una instalación exitosa?

Este es mi diseño de archivo \ widget.xml, si te sirve de ayuda:

<RelativeLayout android:id="@+id/relativeLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android"> 
    <TextView android:layout_width="wrap_content" android:id="@+id/blankspot" android:layout_height="5dp" android:gravity="center" android:shadowDy="1" android:shadowDx="1" android:layout_centerHorizontal="true"></TextView> 
    <ImageButton android:layout_below="@+id/blankspot" android:layout_width="60dp" android:layout_height="60dp" android:id="@+id/widgetIconButton" android:layout_centerHorizontal="true" android:scaleType="centerCrop" android:src="@drawable/volumeprofilesplus" android:background="@null"></ImageButton> 
    <ImageView android:layout_width="60dp" android:layout_height="20dp" android:id="@+id/override" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:scaleType="fitXY" android:background="@null" android:src="@drawable/overredcaps" android:visibility="invisible"></ImageView> 
    <ImageButton android:layout_below="@+id/widgetIconButton" android:layout_width="70dp" android:layout_height="30dp" android:id="@+id/widgetSettingsButton" android:layout_centerHorizontal="true" android:scaleType="fitXY" android:src="@drawable/settings" android:background="@null"></ImageButton> 
</RelativeLayout> 

Y el xml \ widget_provider.xml:

<?xml version="1.0" encoding="utf-8"?> 
<appwidget-provider 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:minWidth="72dip" 
    android:minHeight="72dip" 
    android:updatePeriodMillis="0" 
    android:initialLayout="@layout/main" >  
</appwidget-provider> 
+1

Por favor, puesto que su widget de {} .xml – Force

+0

manifiesto o proveedor de XML? Déjeme descubrir cómo pegar el código correctamente ... – JamieB

+0

'layouts \ widget.xml' - ¿es eso un" error tipográfico "o su proveedor xml realmente está en la carpeta de diseño? Debería estar en 'res/xml/widget.xml'. –

Respuesta

17

Así que aquí está la solución que se me ocurrió:

Es necesario una actividad que aparecerá en el lanzador. Así que primero tenemos ye receptor Olde flash, de este modo:

<receiver android:name=".VolumeProfilesWidget" android:label="@string/app_name"> 
    <intent-filter> 
     <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />     
     <!-- Broadcast Receiver that will also process our self created action --> 
     <action android:name="net.thepurge.volumeprofiles.plus.VolumeProfilesWidget.ACTION_WIDGET_RECEIVER"/>    
    </intent-filter> 
    <meta-data android:name="android.appwidget.provider" android:resource="@xml/volumeprofiles_widget_provider" /> 
</receiver> 

Y entonces necesitamos algo de actividad, con las principales y el lanzador establecen:

<activity android:name=".MainActivity" 
      android:label="@string/app_name"> 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" />     
     <action android:name="net.thepurge.volumeprofiles.plus.VolumeProfilesWidget.ACTION_WIDGET_CONFIGURE"/> 
    </intent-filter> 
</activity> 

Por lo que yo puedo decir que hacer esto incluso si se supone que su widget es un widget puro sin actividades asociadas. Como mínimo, realice una actividad ficticia que inicie una pantalla que diga "Su widget está ahora listo para usar. Búsquelo en widgets y arrástrelo a su pantalla de inicio".

En mi caso, mi widget lanzó una actividad cuando lo pulsaste, por lo que hice esa actividad en LANZADOR/PRINCIPAL y acabo de agregar un diálogo emergente de una sola vez que básicamente dice "puedes ejecutar esto como una aplicación pero puedes quiero usar el widget en su lugar ".

Tenga en cuenta que en el emulador 4.0, nunca conseguí que mi widget apareciera en una instalación por primera vez antes de este cambio. El simple hecho de tener una actividad establecida en MAIN y LAUNCHER parecía ser suficiente para que el widget apareciera.

+0

¿Es esto solo un problema con el emulador o afecta esto también a los dispositivos con Android 4.0? –

+1

Aparentemente sí. Ver [Issue 24208] (http://code.google.com/p/android/issues/detail?id=24208) –

+3

Sí, también está en dispositivos. La primera vez que me enteré fue de un cliente que compró mi aplicación para un dispositivo 4.0 y no pudo encontrarla. Pudo hacerlo aparecer reiniciando, pero no creo que "cállate y reinicia" sea una muy buena solución a largo plazo. (Aunque funcionó para Microsoft durante años). – JamieB

1

Es necesario iniciar manualmente la aplicación asociada al al menos una vez para que aparezca el widget. Antes de que está en un estado no ejecutable y no va a recibir emisiones, etc.

+0

Ah, entonces ¿podría haber sido una coincidencia que lo vi al reiniciar, y lo que realmente lo consiguió fue abrirlo en la vista previa del widget? Además de la vista previa del widget, ¿de qué otra forma podemos decirle a las personas que "inicien manualmente la aplicación asociada"? Técnicamente es solo un widget: no hay nada que mostrar en "aplicaciones". – JamieB

+0

Podría ser, no he estudiado esto en detalle. Agregue una actividad de prueba simple y pruébelo. Si resulta que esto es necesario, puede usarlo para cambiar la configuración, dar instrucciones, etc. No es ideal, estoy de acuerdo. –

+1

He votado en contra porque no creo que esto sea un intento. Tengo un widget puro que utilicé sin ejecutar una aplicación asociada, en 2.3 y 4.1. Debo admitir que estoy aquí porque ese artilugio se volvió poco convencional, pero durante un tiempo funcionó bien como un "widget puro". – Tom

3

Tiene el mismo problema. Lo arreglé borrando las etiquetas <PreferenceScreen> en mi appwidgetprovider.xml(located in res/xml).

+2

Nunca tuve etiquetas PreferenceScreen en ninguna parte. – JamieB

9

Después de días me di cuenta de la solución

así que vamos a ir a ninguna de sus actividades que se la pusieron en marcha al abrir la aplicación y en la actividad principal agregar sólo esta línea

sendBroadcast (nueva Intención (Intent.ACTION_MAIN) .addCategory (Intención.CATEGORY_HOME));

como ejemplo

public class Default class extends Activity { 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
     sendBroadcast(new Intent(Intent.ACTION_MAIN) 
     .addCategory(Intent.CATEGORY_HOME)); 
    setContentView(R.layout.main); 



} 

eso es todo, esto le dará al sistema que la aplicación principal está en funcionamiento y se obtendrá el widget hacia el lanzador :) línea simple que es que no modifica nada en el manifiesto simplemente mantén la forma en que desarrollaste tu aplicación que muestra widgets normalmente en las versiones anteriores < 4.x

+0

esto funciona. Gracias. –

+0

Funcionó para mí también – Coderji

Cuestiones relacionadas