#android #widget #android-appwidget #inflate
#Android #виджет #android-appwidget #раздувать
Вопрос:
Я впервые делаю простой виджет, и, похоже, в используемом мной руководстве чего-то не хватает, потому что в моем LogCat указано «Ошибка раздувания AppWidget» при выборе его из всплывающего списка виджетов.
Согласно руководству, я сделал это.
Макет:
<TextView android:id="@ id/widget_textview" android:text="@string/widget_text"
android:layout_height="wrap_content" android:layout_width="wrap_content"
android:layout_gravity="center_horizontal|center"
android:layout_marginTop="5dip" android:padding="10dip"
android:textColor="@android:color/black" />
</LinearLayout>
Класс:
package hello.widget;
import android.appwidget.AppWidgetProvider;
public class HelloWidget extends AppWidgetProvider {
}
Строки:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Hello Widget</string>
<string name="widget_text">Hello Widget!</string>
</resources>
Поставщик виджетов:
<?xml version="1.0" encoding="utf-8"?>
appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android">
android:minWidth="146dip"
android:minHeight="72dip"
android:updatePeriodMillis="10000"
android:initialLayout="@layout/main"
</appwidget-provider>
Манифест:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="hello.widget" android:versionCode="1" android:versionName="1.0">
<uses-sdk android:minSdkVersion="3" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<!-- Broadcast Receiver that will process AppWidget updates -->
<receiver android:name="hello.widget.HelloWidget" android:label="@string/app_name">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/hello_widget_provider" />
</receiver>
</application>
</manifest>
Ответ №1:
Вам не хватает открытия <LinearLayout>
в вашем файле макета. То, что у вас здесь есть, даже не должно компилироваться.
Вам также не хватает всей реализации вашего AppWidgetProvider
. Вам необходимо реализовать onUpdate()
, чтобы указать, что должен отображать виджет приложения.
Кроме того, ваш updatePeriodMillis
размер меньше допустимого — таким образом, вы не можете обновлять виджет приложения каждые 10 секунд.
Кроме того, убедитесь, что у вашего макета есть имя main.xml
, или обновите android:initialLayout
его, чтобы отразить правильное имя макета.
Комментарии:
1. Привет, спасибо за помощь. Теперь он запущен и работает.
Ответ №2:
Мое решение:
public void onReceive(Context context, Intent intent)
{
String action = intent.getAction();
if (AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(action))
{
long days = (((calendar.getTimeInMillis()- date1.getTime())/1000))/86400;
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);
//Intent AlarmClockIntent = new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER).setComponent(new ComponentName("com.android.alarmclock", "com.android.alarmclock.AlarmClock"));
// PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, AlarmClockIntent, 0);
Intent Date_Change= new Intent(Intent.ACTION_DATE_CHANGED);
PendingIntent pendingIntent2=PendingIntent.getActivity(context,0, Date_Change, 0);
views.setOnClickPendingIntent(R.id.textView1, pendingIntent2);
views.setTextViewText(R.id.textView1,"" days);
//views.setOnClickPendingIntent(R.id.AnalogClock, pendingIntent);
//AppWidgetManager.getInstance(context).updateAppWidget(intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS), views);
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
ComponentName thisWidget = new ComponentName(context, Widget.class);
appWidgetManager.updateAppWidget(thisWidget, views);
}
}