【问题标题】:Android Problem loading widget - without errors in the logcatAndroid问题加载小部件-logcat中没有错误
【发布时间】:2021-03-02 00:37:32
【问题描述】:

我在 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);
}

这是我的小部件布局文件,请记住,我每次都将 3 个中的 2 个设置为“消失”的可见性:

<?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>

【问题讨论】:

  • 请发布布局文件
  • 我添加了widget布局文件,请看,谢谢
  • 您是否在MainWidget 上覆盖了onUpdate()
  • 在代码中可以看到,我没有,我贴了整个类,只有变量和onReceive
  • 从哪里调用onReceive() (MainWidget)?

标签: java android canvas widget android-widget


【解决方案1】:

检查您在 Widget 中的视图中使用的元素..

Documentation link

RemoteViews 对象(因此,App Widget)可以支持以下布局类:

  • 框架布局

  • 线性布局

  • 相对布局

  • 网格布局

还有以下小部件类:

  1. 模拟时钟
  2. 按钮
  3. 天文钟
  4. 图像按钮
  5. 图像视图
  6. 进度条
  7. 文本视图
  8. ViewFlipper
  9. 列表视图
  10. 网格视图
  11. 堆栈视图
  12. AdapterViewFlipper

使用禁止的元素会导致这种情况

加载小部件时出现问题 消息,但没有说明发生在哪里。

【讨论】:

  • 我在小部件布局上只使用了允许的布局和类,正如您在我发布的代码中看到的那样
  • com.l_es.analogclockcustomization.AnalogClockDesign 这是上面列表中没有的布局,但在您的clock_widget_layout.xml中
  • 它而不是您在列表中指定的 AnalogClock,b/c 不推荐使用 AnalogClock 我采用原始代码并使用它而不是 android 库
  • 您必须完全使用这些类 - 您不能创建与 RemoteViews 一起使用的 AnalogClock 的副本。
  • AnalogClock 已弃用,我该如何使用它?我使用了来自 android 开发者网站的完全相同的代码 1 到 1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多