Android проблема с загрузкой виджета — без ошибок в logcat

#java #android #canvas #widget #android-widget

#java #Android #холст #виджет #android-виджет

Вопрос:

Я создал виджет аналоговых часов на Java, и по какой-то причине я все время получаю «Виджет загрузки проблем», единственное, что я получаю от logcat, когда пытаюсь разместить виджет:

 2020-11-18 19:19:13.162 9482-9482/? E/Zygote: isWhitelistProcess - Process is Whitelisted
2020-11-18 19:19:13.162 9482-9482/? E/Zygote: accessInfo : 1
2020-11-18 19:19:13.166 9482-9482/? I/ckcustomizatio: Late-enabling -Xcheck:jni
2020-11-18 19:19:13.182 9482-9482/? E/ckcustomizatio: Unknown bits set in runtime_flags: 0x8000
2020-11-18 19:19:13.196 9482-9482/com.l_es.analogclockcustomization D/ActivityThread: setConscryptValidator
2020-11-18 19:19:13.196 9482-9482/com.l_es.analogclockcustomization D/ActivityThread: setConscryptValidator - put
  

и виджет представляет собой всего лишь черный квадрат с надписью «Проблема загрузки виджета».

вот класс виджета:

 public class MainWidget extends AppWidgetProvider {

    static RemoteViews views;
    //preferences
    private static SharedPreferences custClockPrefs;
    //number of possible designs
    private static int numClocks;
    //IDs of Analog Clock elements
    static int[] clockDesigns;

    public void onReceive(Context context, Intent intent) {

        numClocks = context.getResources().getInteger(R.integer.num_clocks);
        clockDesigns = new int[numClocks];
        for(int d = 0; d < numClocks; d  ){
            clockDesigns[d] = context.getResources().getIdentifier
                    ("AnalogClock" d, "id", context.getPackageName());
        }
        //find out the action
        String action = intent.getAction();
        //is it time to update
        if(AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(action)) {
            views = new RemoteViews(context.getPackageName(),
                    R.layout.clock_widget_layout);

            AppWidgetManager.getInstance(context).updateAppWidget
                    (intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS), views);

            custClockPrefs = context.getSharedPreferences("CustomClockPrefs", 0);
            int chosenDesign = custClockPrefs.getInt("clockdesign", 0);
            if(chosenDesign >= 0){
                for(int d = 0; d < numClocks; d  ){
                    if(d != chosenDesign)
                        views.setViewVisibility(clockDesigns[d], View.INVISIBLE);
                }
                views.setViewVisibility(clockDesigns[chosenDesign], View.VISIBLE);
            }

            Intent choiceIntent = new Intent(context, ClockChoice.class);
            PendingIntent clickPendIntent = PendingIntent.getActivity
                    (context, 0, choiceIntent, PendingIntent.FLAG_UPDATE_CURRENT);
            views.setOnClickPendingIntent(R.id.custom_clock_widget, clickPendIntent);

        }
    }

}
  

вот функция рисования, которую я использую для рисования часов:

 @Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    final float w = (float) getWidth() / 2;
    final float h = (float) getHeight() / 2;

    final int saveCount = canvas.save();
    canvas.translate(w, h);
    final float scale = Math.min((float) w / mDial.getIntrinsicWidth(),
            (float) h / mDial.getIntrinsicHeight());
    if (scale < 1f) {
        canvas.scale(scale, scale, 0f, 0f);
    }
    mDial.draw(canvas);

    final float hourAngle = mTime.get(Calendar.HOUR) * 30f;
    canvas.rotate(hourAngle, 0f, 0f);
    mHourHand.draw(canvas);

    final float minuteAngle = mTime.get(Calendar.MINUTE) * 6f;
    canvas.rotate(minuteAngle - hourAngle, 0f, 0f);
    mMinuteHand.draw(canvas);

    if (mEnableSeconds) {
        final float secondAngle = mTime.get(Calendar.SECOND) * 6f;
        canvas.rotate(secondAngle - minuteAngle, 0f, 0f);
        mSecondHand.draw(canvas);
    }
    canvas.restoreToCount(saveCount);
}
  

Вот мой файл макета виджета, имейте в виду, что я устанавливаю каждый раз, когда 2 из 3 должны быть с видимостью «пропал»:

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@ id/custom_clock_widget"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="@dimen/clock_margin"
    android:gravity="center">

    <com.l_es.analogclockcustomization.AnalogClockDesign
        android:id="@ id/AnalogClock0"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:showSecondHand="false"
        app:dial="@drawable/clock_dial_2"
        app:hour="@drawable/clock_hour_hand_2"
        app:minute="@drawable/clock_minute_hand_2"/>

    <com.l_es.analogclockcustomization.AnalogClockDesign
        android:id="@ id/AnalogClock1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:showSecondHand="false"
        app:dial="@drawable/clock_dial_3"
        app:hour="@drawable/clock_hour_hand_3"
        app:minute="@drawable/clock_minute_hand_3"/>

    <com.l_es.analogclockcustomization.AnalogClockDesign
        android:id="@ id/AnalogClock2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:showSecondHand="false"
        app:dial="@drawable/clock_dial_4"
        app:hour="@drawable/clock_hour_hand_4"
        app:minute="@drawable/clock_minute_hand_4"/>

</RelativeLayout>
  

clock_widget.xml:

 <?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialLayout="@layout/clock_widget_layout"
    android:minWidth="146dp"
    android:minHeight="146dp"
    android:previewImage="@mipmap/ic_launcher"
    android:resizeMode="vertical|horizontal"
    android:updatePeriodMillis="0"
    android:widgetCategory="home_screen">
</appwidget-provider>
  

Комментарии:

1. Пожалуйста, опубликуйте файл макета

2. Я добавил файл макета виджета, пожалуйста, посмотрите, спасибо

3. Вы переопределили onUpdate() on MainWidget ?

4. Да. Вернемся к сути… У меня также есть эта ошибка. Это было связано с неподдерживаемыми компонентами макета. Я не могу понять причину здесь…

5. Привет, ты можешь просто показать мне clock_widget.xml ?

Ответ №1:

Проверьте элементы, которые вы использовали в представлении в виджете..

Ссылка на документацию

Объект RemoteViews (и, следовательно, виджет приложения) может поддерживать следующие классы компоновки:

  • FrameLayout

  • LinearLayout

  • RelativeLayout

  • GridLayout

И следующие классы виджетов:

  1. AnalogClock
  2. Кнопка
  3. Хронометр
  4. ImageButton
  5. Просмотр изображения
  6. Панель прогресса
  7. TextView
  8. ViewFlipper
  9. ListView
  10. Просмотр сетки
  11. StackView
  12. AdapterViewFlipper

Использование запрещенных элементов вызывает это очень

Проблема с загрузкой сообщения виджета, без указания, где это произошло.

Комментарии:

1. Я использовал только разрешенные макеты и классы в макете виджета, как вы можете видеть в опубликованном cod eI

2. com.l_es.analogclockcustomization. AnalogClockDesign Это макет, отсутствующий в приведенном выше списке, но в вашем clock_widget_layout.xml

3. вместо AnalogClock, который вы указываете в своем списке, b / c AnalogClock устарел, я взял исходный код и использовал его вместо библиотеки Android

4. Вы должны использовать именно те классы — вы не можете создать копию AnalogClock , с которой работает RemoteViews .

5. AnalogClock устарел, так как я могу его использовать? Я использовал точно такой же код 1 к 1 с сайта разработчика Android