Ошибка при раздувании AppWidget

#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);
    }
}