Я только что закончил свой 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... не забудьте также обновить этот код:
- теперь вы должны отправлять намерения каждому.