27 votes

Android 4.0: les widgets n'apparaissent pas?

J'ai un widget que j'ai créé à l'encontre d'Android 2.1 qui est fine et de vente sur le marché.

J'avais un utilisateur de se plaindre qu'il l'a acheté et il ne s'est jamais montré sur son appareil Android 4.0.

J'ai chargé la version 4.0 de l'émulateur, il couru à partir d'Eclipse, il a rapporté le succès de l'installation et, en fait, je peux voir qu'il figure dans le "Widget" Aperçu de l'app, et je peux courir là-bas et elle semble très bien, mais il ne se trouve pas n'importe où sous "Widgets" -- je ne peux pas vraiment trouver de le faire glisser vers l'écran d'accueil! Je suppose que c'est la même chose que l'utilisateur voit.

Une idée de ce qui se passe ici? Pourquoi est-il bien dans 2.1, mais n'apparait pas dans la liste sur la 4.0, même après une installation réussie?

C'est mon layout\widget.xml fichier, si c'est toute aide:

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

Et la 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>

17voto

JamieB Points 458

Alors, voici la solution que j'ai trouvé:

Vous avez besoin d'une activité qui apparaîtra sur l'écran de lancement. Alors d'abord, nous avons ye olde widget récepteur, comme suit:

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

Et puis nous avons besoin d'un peu d'activité, avec le PRINCIPAL et le LANCEUR de jeu:

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

Aussi loin que je peux dire que vous DEVEZ le faire même si votre widget est juste censé être un pur widget sans activités qui y sont associées. À tout le moins, faire l'un mannequin d'activité qui lance un écran qui dit "Votre widget est maintenant prêt à l'utilisation! Recherchez dans les widgets et faites-le glisser sur votre écran d'accueil!"

Dans mon cas, mon widget lancé une activité lorsque vous l'a poussé, alors j'ai fait cette activité dans le LANCEUR d'applications/MAIN et ont juste ajouté un dialogue pop-up qui dit en gros "vous pouvez l'exécuter comme une demande, mais vous pouvez utiliser le widget à la place".

A noter que sur la version 4.0 de l'émulateur, je n'ai jamais été l'obtention de mon widget pour afficher sur un premier temps installer avant ce changement. Il suffit d'avoir une activité PRINCIPALE et le LANCEUR d'applications semblait être suffisant pour faire le widget affichera.

9voto

Yasin Hassanien Points 1083

Après des jours, j'ai trouvé la solution

ainsi permet d'aller à l'une de vos activités qui seront lancées lorsque vous ouvrez l'application et de l'activité principale ajouter uniquement cette ligne

sendBroadcast(new Intent(Intent.ACTION_MAIN).addCategory(Intention.CATEGORY_HOME));

à titre d'exemple

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



}

c'est ça , ce sera le système que l'application principale est maintenant en cours d'exécution et il obtiendra le widget à l'écran de lancement :) simple ligne, il ne rien modifier dans le manifeste il suffit de garder la façon de développer ur application qui montre widget normalement dans les versions précédentes, < 4.x

3voto

J'ai le même problème. Je l'ai corrigé en supprimant les balises <PreferenceScreen> dans mes appwidgetprovider.xml(located in res/xml) .

1voto

Nikolay Elenkov Points 32843

Vous devez démarrer manuellement l'application associée au moins une fois pour que le widget s'affiche. Avant cela, il est dans un état non exécutable et ne recevra pas de diffusions, etc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X