Android Widget показывает странное изображение во время обновления - PullRequest
1 голос
/ 02 марта 2011

У меня здесь странный ... У меня Motorola i1 с Nextel под управлением Android 1.5

У меня есть виджет для Android. Когда я запускаю службу, которая обновляет этот виджет, я вижу изображение из другого виджета (Launch DC Contact)

Оно показывает это изображение в расположении моего виджета, но когда "обновление" моего виджета завершено, оно заменяется макетом, который у меня есть для моего виджета.

Это как если бы был кэш изображений виджетов, и он показывает вещи оттуда, пока не будет выполнено обновление моего виджета.

Если мое обновление занимает много времени, пользователь может видеть это странное изображение в течение 2-3 секунд.

public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) {
        Log.d(TAG, "Enter onUpdate");
        final int N = appWidgetIds.length;

        for (int i = 0; i < N; i++) {
            int widgetId = appWidgetIds[i];
            RemoteViews views = new RemoteViews(context.getPackageName(),
                    R.layout.widget_initial_layout);
            Intent intent = new Intent(context, MainActivity.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
                    intent, 0);
            views.setOnClickPendingIntent(R.id.WidgetLayout, pendingIntent);
            views.setTextViewText(R.id.NEWCountTextView, Integer.toString(NEWC));
            views.setTextViewText(R.id.ACKCountTextView, Integer.toString(ACKC));
            views.setTextViewText(R.id.PKUCountTextView, Integer.toString(PKUC));
            views.setTextViewText(R.id.PODCountTextView, Integer.toString(PODC));
            if (errorMessage.contentEquals("")) {
                errorMessage = (new Date()).toString();
                views.setTextColor(R.id.LastUpdatedTextView, Color.BLACK);
            } else {
                views.setTextColor(R.id.LastUpdatedTextView, Color.RED);
            }
            views.setTextViewText(R.id.LastUpdatedTextView, errorMessage);
            appWidgetManager.updateAppWidget(widgetId, views);
        }
        Log.d(TAG, "Exit onUpdate");
    }

public void onReceive(Context context, Intent intent) {
    Log.d(TAG, "Enter onReceive");
    String action = intent.getAction();
    if (action.contentEquals("android.appwidget.action.APPWIDGET_UPDATE")) {
        Bundle extras = intent.getExtras();
        if (extras != null) {
            NEWC = extras.getInt("NEWCOUNT");
            ACKC = extras.getInt("ACKCOUNT");
            PKUC = extras.getInt("PKUCOUNT");
            PODC = extras.getInt("PODCOUNT");
            errorMessage = extras.getString("ERRORMESSAGE");
        }
    }

super.onReceive (контекст, намерение); Log.d (TAG, «Выход при получении»); } вот макет

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/WidgetLayout" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content"
    android:gravity="top"
    android:orientation="vertical"
    android:background="@drawable/bg"
    >

    <TextView 
        android:text="ORDERS" 
        android:id="@+id/TextView01" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:textSize="25dip"
        android:gravity="top|center"
        android:textColor="#ffff00"
        android:textStyle="bold"
        />

    <TextView 
        android:text="" 
        android:id="@+id/TextView01" 
        android:layout_width="fill_parent" 
        android:layout_height="6dip"
        android:gravity="top|center"
        android:background="#0000ff"
        />

    <LinearLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/LinearLayout02" 
        android:layout_height="wrap_content" 
        android:layout_width="fill_parent"
        android:gravity="top|center"
        android:orientation="horizontal"        
        >
        <LinearLayout 
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/CountsLinearLayout" 
            android:layout_height="fill_parent" 
            android:layout_width="wrap_content"
            android:gravity="top"
            android:orientation="vertical"
            >
            <TextView 
                android:text="NEW" 
                android:id="@+id/TextView11" 
                android:layout_width="75dip" 
                android:layout_height="wrap_content"
                android:textSize="25dip"
                android:gravity="center"
                android:textColor="#000000"
                android:textStyle="bold"

                />
            <TextView 
                android:text="" 
                android:id="@+id/NEWCountTextView" 
                android:layout_width="75dip" 
                android:layout_height="wrap_content"
                android:textSize="25dip"
                android:gravity="center"
                android:textColor="#000000"
                android:textStyle="bold"
                />
        </LinearLayout>

        <LinearLayout 
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/LinearLayout04" 
            android:layout_height="fill_parent" 
            android:layout_width="wrap_content"
            android:gravity="top"
            android:orientation="vertical"
            >
            <TextView 
                android:text="ACK" 
                android:id="@+id/TextView21" 
                android:layout_width="75dip" 
                android:layout_height="wrap_content"
                android:textSize="25dip"
                android:gravity="center"
                android:textColor="#000000"
                android:textStyle="bold"

                />
            <TextView 
                android:text="" 
                android:id="@+id/ACKCountTextView" 
                android:layout_width="75dip" 
                android:layout_height="wrap_content"
                android:textSize="25dip"
                android:gravity="center"
                android:textColor="#000000"
                android:textStyle="bold"
                />
        </LinearLayout>

        <LinearLayout 
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/LinearLayout05" 
            android:layout_height="fill_parent" 
            android:layout_width="wrap_content"
            android:gravity="top"
            android:orientation="vertical"
            >
            <TextView 
                android:text="PKU" 
                android:id="@+id/TextView31" 
                android:layout_width="75dip" 
                android:layout_height="wrap_content"
                android:textSize="25dip"
                android:gravity="center"
                android:textColor="#000000"
                android:textStyle="bold"
                />
            <TextView 
                android:text="" 
                android:id="@+id/PKUCountTextView" 
                android:layout_width="75dip" 
                android:layout_height="wrap_content"
                android:textSize="25dip"
                android:gravity="center"
                android:textColor="#000000"
                android:textStyle="bold"
                />
        </LinearLayout>

        <LinearLayout 
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/LinearLayout06" 
            android:layout_height="fill_parent" 
            android:layout_width="wrap_content"
            android:gravity="top"
            android:orientation="vertical"
            >
            <TextView 
                android:text="POD" 
                android:id="@+id/TextView41" 
                android:layout_width="75dip" 
                android:layout_height="wrap_content"
                android:textSize="25dip"
                android:gravity="center"
                android:textColor="#000000"
                android:textStyle="bold"
                />
            <TextView 
                android:text="" 
                android:id="@+id/PODCountTextView" 
                android:layout_width="75dip" 
                android:layout_height="wrap_content"
                android:textSize="25dip"
                android:gravity="center"
                android:textColor="#000000"
                android:textStyle="bold"
                />
        </LinearLayout>


    </LinearLayout>

    <TextView 
        android:text="" 
        android:id="@+id/TextView01" 
        android:layout_width="fill_parent" 
        android:layout_height="6dip"
        android:gravity="bottom|center"
        android:background="#0000ff"
        />

    <TextView 
        android:text="" 
        android:id="@+id/LastUpdatedTextView" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:textSize="15dip"
        android:gravity="center"
        android:textColor="#000000"
        android:textStyle="bold"
        />                  
</LinearLayout>

Вы видели что-нибудь подобное?

спасибо

Ответы [ 2 ]

1 голос
/ 16 февраля 2012

У меня была та же самая проблема в моем виджете, как вы описали, много искала решение и не могла найти ни одной.То, что я в итоге сделал, это какой-то обходной путь, который, кажется, хорошо работает в моем случае.Я сделал следующее: вместо обновления виджетов непосредственно из метода onUpdate () я запустил службу, которая обрабатывает обновление, а затем убила себя.Это решило проблему на эмуляторе и на устройстве, на котором виджет застрял во время обновления.Вот пример кода:

AppWidgetProvider:

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    context.startService(new Intent(context, WidgetService.class));
}

Служба:

@Override
public void onStart(Intent intent, int startId) {
    started(intent);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    started(intent);
    return START_STICKY;
}


private void started(Intent intent) {
    //update here the widgets
    Context context = getApplicationContext();
    updateWidgets(context);
    stopSelf();//killing the service
}

private void updateWidgets(Context context) {
    AppWidgetManager appmanager = AppWidgetManager.getInstance(context);
    ComponentName cmpName = new ComponentName(context, widgetClass);
    int[] widgetIds = appmanager.getAppWidgetIds(cmpName);
    RemoteViews rView = new RemoteViews(context.getPackageName(), layoutId);
    for (int wid : widgetIds) {
        //all updates here
        rView.setTextViewText(tvId, desc);
        appmanager.updateAppWidget(wid, rView);
    }
}

Обратите внимание, почему этот обходной путь решает проблему, но хорошо то, чтоНадеюсь, это поможет

0 голосов
/ 07 декабря 2012

У меня была эта проблема на 4.0 и 4.2 при ручной отправке android.appwidget.action.APPWIDGET_UPDATE широковещательной рассылки для обновления виджета.
Исправлено с помощью пользовательского действия, например

<intent-filter>
    <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    <action android:name="android.appwidget.action.APPWIDGET_DISABLED" />
    <action android:name="my.app.action.APPWIDGET_REFRESH" />
</intent-filter>
...