Как добавить несколько виджетов в одном приложении? - PullRequest
62 голосов
/ 03 апреля 2010

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

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

helloSmall helloMedium helloLarge

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

Ответы [ 5 ]

101 голосов
/ 03 апреля 2010

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

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

Теперь, если вам нужно больше различий в ваших виджетах, чем в <appwidget-provider> 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>
26 голосов
/ 07 февраля 2011

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

11 голосов
/ 21 апреля 2011

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

Вам необходимо добавить второго провайдера виджетов;

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

Наслаждайтесь

5 голосов
/ 12 мая 2010

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

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

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

что теперь?

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

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

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

<?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".

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

удачи.

0 голосов
/ 22 января 2013

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

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

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

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


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

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