как добавить несколько виджетов в одном приложении?
Я только что закончил свой виджет для Android. Теперь мне нужно иметь разные размеры этого вигета для пользователя на выбор. например, мне нужен виджет среднего, малого и большого размера. поэтому, когда пользователь устанавливает приложение и удерживает главный экран, а затем выбирает виджет, в меню виджета я хочу, чтобы он увидел три виджета с тем же именем приложения, но с размером. что-то вроде этого:
helloSmall
helloMedium
helloLarge
У меня средний готов, но как я могу сделать маленький и большой в одном приложении? зная, что все три размера содержат одни и те же точные данные и действия, просто размер и фон отличаются.
спасибо.
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отправитьIntents для вашего дубликатаServices... не забудьте обновить этот код:
- теперь вы должны отправить намерения каждого услуги.
Comments