#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()
onMainWidget
?4. Да. Вернемся к сути… У меня также есть эта ошибка. Это было связано с неподдерживаемыми компонентами макета. Я не могу понять причину здесь…
5. Привет, ты можешь просто показать мне clock_widget.xml ?
Ответ №1:
Проверьте элементы, которые вы использовали в представлении в виджете..
Объект RemoteViews (и, следовательно, виджет приложения) может поддерживать следующие классы компоновки:
-
FrameLayout
-
LinearLayout
-
RelativeLayout
-
GridLayout
И следующие классы виджетов:
- AnalogClock
- Кнопка
- Хронометр
- ImageButton
- Просмотр изображения
- Панель прогресса
- TextView
- ViewFlipper
- ListView
- Просмотр сетки
- StackView
- 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