Как добавить несколько виджетов в одном приложении?

Я только что закончил свой Android-виджет. Теперь мне нужно иметь разные размеры этого wiget для пользователя на выбор. например, мне нужен виджет среднего, малого и большого размера. поэтому, когда пользователь установит приложение и удерживает главный экран, а затем выберите виджет, в меню виджета я хочу, чтобы он увидел три виджета с тем же именем приложения, но с размером. что-то вроде этого:

helloSmall helloMedium helloLarge

У меня средний, но как я могу сделать маленький и большой в одном приложении? зная, что все три размера содержат одни и те же точные данные и действия, только размер и фон разные.

Спасибо.

Ответ 1

Для каждого типа файла манифеста вам нужно определение приемника, например:

    <receiver android:name=".MyWidget" android:label="@string/medium_widget_name">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter>
        <meta-data android:name="android.appwidget.provider"
            android:resource="@xml/medium_widget_provider" />
    </receiver>

    <receiver android:name=".MyWidget" android:label="@string/large_widget_name">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter>
        <meta-data android:name="android.appwidget.provider"
            android:resource="@xml/large_widget_provider" />
    </receiver>

Это позволит вам использовать один и тот же класс AppWidgetProvider для нескольких виджетов с разными именами виджетов и разными размерами, определенными в <appwidget-provider> XML.

Теперь, если вам нужно больше различий в ваших виджетах, чем в XML <appwidget-provider>, я бы создал базовый класс виджетов, который реализует все обычное поведение разных типов:

public abstract class MyBaseWidget extends AppWidgetProvider

И тогда каждая из ваших конкретных реализаций может расширить MyBaseWidget. Затем в вашем файле манифеста у вас будет определение приемника для каждой из ваших конкретных реализаций, например:

    <receiver android:name=".MyMediumWidget" android:label="@string/medium_widget_name">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter>
        <meta-data android:name="android.appwidget.provider"
            android:resource="@xml/medium_widget_provider" />
    </receiver>

    <receiver android:name=".MyLargeWidget" android:label="@string/large_widget_name">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter>
        <meta-data android:name="android.appwidget.provider"
            android:resource="@xml/large_widget_provider" />
    </receiver>

Ответ 2

Собственно, android: имя для каждого виджета должно быть другим. Если вы сделаете это, как в примере, только один виджет будет виден в списке виджетов.

Ответ 3

Ребята, у меня была та же проблема.

Вы также должны добавить второго поставщика виджетов,

<receiver android:name=**".MyWidget**" android:label="@string/medium_widget_name">
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>
    <meta-data android:name="android.appwidget.provider"
        android:resource="@xml/medium_widget_provider" />
</receiver>

<receiver android:name=**".MyWidget2"** android:label="@string/large_widget_name">
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>
    <meta-data android:name="android.appwidget.provider"
        android:resource="@xml/large_widget_provider" />
</receiver>

Enjoy

Ответ 4

Хорошо, так что в основном вам понадобится:

для каждого виджета. ex: main_small.xml, main_medium.xml...

в каталоге xml добавьте поставщика для каждого виджета. ex: small_provider.xml, medium_provider.xml... и т.д. (обратите внимание, если у вас нет каталога xml, добавьте его в каталог с возможностью рисования).

теперь что!

  • определить получателя в манифесте для каждого виджета. (точно так же, как в главном ответе)

  • вы можете использовать один и тот же макет или раскладку. в основном это зависит от вас.

  • у вашего провайдера вы должны иметь что-то вроде этого:

<?xml version="1.0" encoding="utf-8"?>

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="146dip"
    android:minHeight="138dip"
    android:updatePeriodMillis="10000"
    android:initialLayout="@layout/main"
    />

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

> android:initialLayout="@layout/medium".

Надеюсь, это поможет, если не сообщите мне, и я могу загрузить рабочий пример на своем веб-сайте, и вы можете более внимательно рассмотреть его. пожалуйста, дайте мне знать, как это происходит.

Желаем удачи.

Ответ 5

Дополнительная информация для других ответов...

  • Если вы дублируете упомянутые файлы, и если ваш виджет использует Service для обеспечения некоторых функций, возможно, вам придется дублировать вашу службу.

  • Если вы дублируете Service, , помните, чтобы обновить манифест с помощью новой службы, в противном случае новая служба не будет запущена...

Это потратило время на меня.


Если вы используете BroadcastReceiver для отправки Intent в ваш дубликат Service s... не забудьте также обновить этот код:

  • теперь вы должны отправлять намерения каждому.