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

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

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

helloSmall helloMedium helloLarge

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

62
задан Adinia 21 March 2019 в 14:48
поделиться

2 ответа

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

    <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 для нескольких виджетов с разными именами виджетов и разными размерами, определенными в XML.

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

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>
101
ответ дан 24 November 2019 в 16:40
поделиться

Итак, в основном вам понадобится:

файл макета для каждого виджета. например: main_small.xml, main_medium.xml ...

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

теперь что!

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

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

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


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

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

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

Желаю удачи.

5
ответ дан 24 November 2019 в 16:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: