Android AppWidget не отображается на некоторых телефонах - PullRequest
5 голосов
/ 31 марта 2012

У меня действительно простой appwidget (два просмотра текста и кнопка). Я проверил это на сенсорной панели, Droid 1 и Droid Razr. Работает на всем, кроме Razr. Когда я добавляю виджет на домашний экран, он не отображается; это просто невидимо. Если я удерживаю его в том месте, где он будет, он выбирает виджет, и если я перемещаю его, я вижу, что другие виджеты уходят с дороги, но он полностью невидим.

Я поместил несколько тостов в методы onReceive и onEnabled, а Toast отображает всю нужную информацию (например, намеренные действия и дополнительные функции).

У кого-нибудь есть опыт?

РЕДАКТИРОВАТЬ: Пожалуйста, имейте в виду, что это только для отладки и не соответствует передовым практикам

public class GoogleTalkWidget extends AppWidgetProvider {

    Button sendMessage;

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "Received Intent Action = " +
                intent.getAction(), Toast.LENGTH_SHORT).show();

        if(intent.getAction().equals(Utils.RECEIVED_MESSAGE_WIDGET)){
            RemoteViews views = new RemoteViews(context.getPackageName(),
                R.layout.main_widget);

            views.setTextViewText(R.id.widget_message, 
                (CharSequence)intent.getStringExtra("MESSAGE"));

            views.setTextViewText(R.id.widget_sender, 
                (CharSequence)intent.getStringExtra("SENDER"));

            Toast.makeText(context, "Received " + 
                intent.getStringExtra("MESSAGE") + " FROM " + 
                intent.getStringExtra("SENDER"), Toast.LENGTH_SHORT).show();

            ComponentName cn = new ComponentName(context, 
                GoogleTalkWidget.class);  

            AppWidgetManager.getInstance(context).updateAppWidget(cn, views);

        }
        super.onReceive(context, intent);
    }

    @Override 
    public void onEnabled(final Context context){
        super.onEnabled(context);

        Toast.makeText(context, "Enabled", Toast.LENGTH_SHORT).show();
    }

}

1 Ответ

1 голос
/ 12 мая 2012

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

Попробуйте, например, переместить все элементы рисования, составляющие ваш виджет, в папку res \ drawable-nodpi и посмотрите, как они работают.

РЕДАКТИРОВАТЬ: Я видел что-то странное в вашем коде

В классе onReceive класса GoogleTalkWidget ваш виджет обновляется только при получении сообщения Utils.RECEIVED_MESSAGE_WIDGET. Я не знаю, для чего это сообщение, но приложение-виджет впервые добавляется на домашний экран, он получает android.appwidget.action.APPWIDGET_UPDATE, а любые другие фильтры намерений регистрируются в файле манифеста, и они транслировавшейся системой в то время (и, конечно же, намерениями, связанными с трансляцией).

Если бы я был на вашей позиции, я бы изменил метод onReceive следующим образом:

@Override
public void onReceive(Context context, Intent intent) {
    Toast.makeText(context, "Received Intent Action = " +
            intent.getAction(), Toast.LENGTH_SHORT).show();
    super.onReceive(context, intent);

    String msg = "No messages yet";

    RemoteViews views = new RemoteViews(context.getPackageName(),
            R.layout.main_widget);

    if(intent.getAction().equals(Utils.RECEIVED_MESSAGE_WIDGET)){
        msg = intent.getStringExtra("MESSAGE");

        views.setTextViewText(R.id.widget_sender, 
            (CharSequence)intent.getStringExtra("SENDER"));

        Toast.makeText(context, "Received " + 
            intent.getStringExtra("MESSAGE") + " FROM " + 
            intent.getStringExtra("SENDER"), Toast.LENGTH_SHORT).show();

        ComponentName cn = new ComponentName(context, 
            GoogleTalkWidget.class);  
    }

    views.setTextViewText(R.id.widget_message, msg);

    AppWidgetManager.getInstance(context).updateAppWidget(cn, views);
}

и посмотрим, что произойдет.

Если ваш виджет не появляется, то это может быть проблема с Razr, но это не похоже на то, потому что я предполагаю, что целая куча других виджетов работает нормально.

Кроме того, хотя ваш код предназначен только для отладки, ваш подход немного проблематичен. Лучшее место для обновления представлений виджетов - метод onUpdate в AppWidgetProvider, а не onReceive. Android предоставляет метод onUpdate для этой цели и onReceive, чтобы сообщить вам, что прибыла зарегистрированная трансляция. Основное отличие состоит в том, что в методе onUpdate Android извлекает все необходимые параметры для вас из полученных дополнений Intent. Еще одна вещь, связанная с обновлениями виджетов, заключается в том, что вы должны предоставить значение android: updatePeriodMillis, отличное от 0 (2100000 - хорошее значение) в вашем XML-файле виджета, даже если вы не хотите периодически обновлять свой виджет. Я где-то видел, что метод onReceive может не вызываться, если это значение равно 0.

Имейте также в виду, что AppWidgetProvider как Broadcast Receiver живет только до тех пор, пока метод onReceive выполняет свою работу, после того как он уничтожен, поэтому он не подходит для «интерактивного» кода, такого как слушатели пользовательского интерфейса и т. Д. Я говорю Вы делаете это, потому что у вас есть объявление Button (Button sendMessage;) в верхней части вашего класса GoogleTalkWidget.

Надеюсь, это поможет ...

...