Пользовательский компонент раздувается в приложении, но не в виджете - PullRequest
0 голосов
/ 20 июня 2020

Фон

Я создал специальный компонент для рисования поверх изображения. На этом этапе я просто расширяю представление.

Моим основным намерением было создать виджет, но я не мог заставить его работать. Я попытался загрузить тот же компонент в основное действие, он сработал Face Palm .

Для ясности я прочитал many many многие многие ... многие разместить на этом топи c. Это не проблема конструктора.

Симптом

Когда я загружаю компонент в виджет, я получаю следующее исключение InflateException (без трассировки стека).

2020-06-20 09:23:56.368 2602-2602/? W/AppWidgetHostView: Error inflating AppWidget AppWidgetProviderInfo(UserHandle{0}/ComponentInfo{com.package/com.package.WidgetProvider}): android.view.InflateException: Binary XML file line #1: Binary XML file line #1: Error inflating class com.package.MyView

Код

Класс виновника

@RemoteViews.RemoteView
public class MyView extends ImageView {

    public MyView(Context context) {
        this(context, null);
    }

    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        // Eventually we'll do something mystical here
    }

}

Вот макет виджета

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_height="match_parent"
     android:layout_width="match_parent">
    <com.package.MyView
        android:id="@+id/myview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/myimage"
        />
    
</LinearLayout>

Примечание: если я переключаю com.package.MyView на ImageView, он работает. См. Ниже (ImageView против MyView) введите описание изображения здесь

Вопрос

Как мне заставить этот компонент правильно надуваться в виджете?

Ответы [ 2 ]

1 голос
/ 21 июня 2020

К сожалению, android не поддерживает потомков поддерживаемых классов виджетов (включая ImageView) см. Примечание в разделе «Создание макета виджета приложения» на странице Создание виджета приложения страница документации

Тем не менее, я обнаружил, что хотя TextClock не указан в списке поддерживаемых макетов, он действительно поддерживается на всех устройствах, которые я пробовал. так что, может быть, не принимайте это как абсолютный факт.

0 голосов
/ 21 июня 2020

Спасибо @Joe за то, что указал мне в неправильном направлении.

Что сработало

Мне в основном пришлось настроить существующий AnalogClock следующим образом

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_height="match_parent"
     android:layout_width="match_parent">
    <AnalogClock
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:dial="@drawable/mydial"
        android:hand_hour="@drawable/myhour"
        android:hand_minute="@drawable/myminute"
        />
</LinearLayout>

Это голые кости, но он выполняет свою работу.

Для записи

  • AnalogClock устарел

  • Расширение класса (cf @ Joe) не работает

  • Копировать вставку Исходный код AnalogClock не работает.

  • Рекомендую прочитать это о создании собственного виджета AnalogClock

Результат

введите описание изображения здесь

...