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



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



helloSmall
helloMedium
helloLarge



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



спасибо.

869   5  

5 ответов:

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

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

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

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

вам нужно фактически добавить второго поставщика виджетов;

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

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

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

файл макета для каждого виджета. например: 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".

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

удачи.

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

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

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

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


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

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

Comments

    Ничего не найдено.