Как создать приложение для Android с виджетами приложения в одном приложении
Я уже сделал одно приложение Android, в котором хранятся дата с именем человека и номером телефона.
Теперь мне нужно разработать один виджет для этого приложения, чтобы показать сегодня (дата, имя человека и номер телефона) с помощью кнопки.
Требования:
- Отдельное приложение с приложением и виджетами.
- Когда я нажимаю кнопку, которая находится в виджетах, она начнет мой
приложение.
- Данные Widget должны всегда синхронизироваться с моим приложением - когда сегодняшние
день (человек 5 и приложение добавить еще 5 человек, затем отобразить виджет
10 человек).
- Как я могу создать этот виджет? Любые рекомендации? Я должен использовать
горизонтальный ScrollView.
Я сделал простую демонстрацию виджета, но я не знаю, как ее синхронизировать с моим приложением.
Поделитесь своим опытом и дайте некоторое представление о моем виджете и приложении.
Ответы
Ответ 1
Я нахожу пару дней, когда я получил какое-то решение. Поэтому я делюсь своей идеей.
Этот сайт был очень полезен для меня.
http://kasperholtze.com/android/how-to-make-a-simple-android-widget/
Я сделал некоторые изменения и сделал свою работу.
Требование:
1. Сделайте приемник и вставьте в это разрешение.
<receiver
android:name=".WatchWidget"
android:label="WatchWidget" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/watch_widget_provider" />
</receiver>
2. В моей стороне требуется верхнее нажатие TextView, поэтому вы можете использовать идентификатор TextView в onUpdate()
.
remoteViews = new RemoteViews(context.getPackageName(),R.layout.widget_lay);
Intent intent = new Intent(context, TestActivity.class);
intent.setAction("callActivity");
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
remoteViews.setOnClickPendingIntent(R.id.widget_textview, pendingIntent);
appWidgetManager.updateAppWidget(new ComponentName(context,WatchWidget.class), remoteViews);
3. Я хочу вызвать базу данных и получить запись и отобразить ее. Теперь вопрос о обновлении?
Итак, я использовал класс таймера и запускаю каждые 1000 секунд, потому что из-за виджета всегда обновляется 30мин (может быть).
@Override
public void onUpdate( final Context context, final AppWidgetManager appWidgetManager, final int[] appWidgetIds )
{
this.appWidgetManager = appWidgetManager;
try {
Timer timer = new Timer();
timer.scheduleAtFixedRate(new MyTime(context, appWidgetManager,appWidgetIds), 1, 1000);
} catch (Exception e) {
System.out.println("Exception:");
}
updateSwitch1(context, appWidgetManager, appWidgetIds[0]);
}
Если у кого-то есть вопросы, добавьте комментарий и спасибо всем, кто дал мне полную поддержку, чтобы сделать этот ответ полезным.
Ответ 2
Создать и настроить виджет
Чтобы зарегистрировать виджет, вы создаете BroadcastReceiver с фильтром намерения для действия android.appwidget.action.APPWIDGET_UPDATE.
<receiver
android:icon="@drawable/icon"
android:label="Example Widget"
android:name="MyWidgetProvider" >
<intent-filter >
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_info" />
</receiver>
Вы также указываете метаданные для виджета через атрибут android: name= "android.appwidget.provider. Файл конфигурации, указанный в этих метаданных, содержит параметры конфигурации для виджета. Если содержит, например, интерфейс обновления, размер и начальный макет виджета.
Создайте новый файл myshape.xml в каталоге /res/drawable. Этот файл определит фон, который мы используем в вашем виджете.
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<stroke
android:width="2dp"
android:color="#FFFFFFFF" />
<gradient
android:angle="225"
android:endColor="#DD2ECCFA"
android:startColor="#DD000000" />
<corners
android:bottomLeftRadius="7dp"
android:bottomRightRadius="7dp"
android:topLeftRadius="7dp"
android:topRightRadius="7dp" />
</shape>
Определите следующий файл widget_layout.xml
в папке res/layout.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="8dip"
android:background="@drawable/myshape" >
<TextView
android:id="@+id/update"
style="@android:style/TextAppearance.Medium"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:gravity="center_horizontal|center_vertical"
android:layout_margin="4dip"
android:text="Static Text" >
</TextView>
</LinearLayout>
теперь создайте класс.
public class MyWidgetProvider extends AppWidgetProvider {
private static final String ACTION_CLICK = "ACTION_CLICK";
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
// Get all ids
ComponentName thisWidget = new ComponentName(context,
MyWidgetProvider.class);
int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
for (int widgetId : allWidgetIds) {
// Create some random data
int number = (new Random().nextInt(100));
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
R.layout.widget_layout);
Log.w("WidgetExample", String.valueOf(number));
// Set the text
remoteViews.setTextViewText(R.id.update, String.valueOf(number));
// Register an onClickListener
Intent intent = new Intent(context, MyWidgetProvider.class);
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context,
0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
remoteViews.setOnClickPendingIntent(R.id.update, pendingIntent);
appWidgetManager.updateAppWidget(widgetId, remoteViews);
}
}