【问题标题】:TextClock in AppWidget not responding to any function callsAppWidget 中的 TextClock 不响应任何函数调用
【发布时间】:2018-01-11 21:41:00
【问题描述】:

我正在为 LG V20/V10 开发一个信息小部件,以便在第二个屏幕中运行(添加一个非常容易:只需将您的类别设置为 36864/0x9000)。目前,我在 RemoteViews 布局中有一个电池视图和一个 TextClock:

<!--info_widget.xml-->

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main"
    android:layout_width="1040px"
    android:layout_height="160px">

    <include
        android:id="@+id/battery"
        layout="@layout/battery_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_toLeftOf="@+id/clock"
        android:layout_gravity="right" />

    <include
        android:id="@+id/clock"
        layout="@layout/clock_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_alignParentEnd="true"
        android:layout_alignParentTop="true"
        android:layout_gravity="right" />

</RelativeLayout>

<!--battery_view.xml-->

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="wrap_content"
    android:layout_height="160px"
    android:layout_gravity="center"
    android:foregroundGravity="center"
    android:orientation="vertical"
    android:padding="2dp">

    <ImageView
        android:id="@+id/battery_view"
        android:layout_width="70px"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:layout_weight="1"
        android:scaleType="centerCrop"
        android:tint="#fff"
        app:srcCompat="@drawable/ic_battery_alert_black_24dp" />

    <TextView
        android:id="@+id/battery_percent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|center"
        android:textColor="#fff"
        android:textSize="40px" />
</LinearLayout>

<!--clock_view.xml-->

<TextClock xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:gravity="center_vertical"
    android:padding="2dp"
    android:textSize="64px"
    android:id="@+id/clock_view"/>

在我的代码中,我有这些函数,它们从 onUpdate() 为每个小部件 ID(在 Kotlin 中)调用:

private fun updateBattery(views: RemoteViews) {
    val level = mBatteryManager?.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
    val charging = mBatteryManager?.isCharging

    mBatteryState.updateState(level as Int, charging as Boolean)

    views.setImageViewResource(R.id.battery_view, mBatteryState.imageResource)

    var color = mPrefs?.getInt("battery_color", Color.WHITE)
    var showPercent = mPrefs?.getBoolean("show_percent", true)

    if (color == null) color = Color.WHITE
    if (showPercent == null) showPercent = true

    views.setInt(R.id.battery_view, "setColorFilter", color)
    views.setTextColor(R.id.battery_percent, color)

    if (showPercent) {
        views.setViewVisibility(R.id.battery_percent, View.VISIBLE)
        views.setTextViewText(R.id.battery_percent, mBatteryState.percent.toString() + "%")
    } else {
        views.setViewVisibility(R.id.battery_percent, View.GONE)
    }
}

private fun updateClock(views: RemoteViews) {
    var hour_24 = mPrefs?.getBoolean("24_hour", false)
    var amPm = mPrefs?.getBoolean("am_pm", true)
    var showDate = mPrefs?.getBoolean("show_date", false)
    var color = mPrefs?.getInt("clock_color", Color.WHITE)

    if (hour_24 == null) hour_24 = false
    if (amPm == null) amPm = true
    if (showDate == null) showDate = false
    if (color == null) color = Color.WHITE

    val format: CharSequence = if (showDate) "EE, d " else {""} +  if (hour_24) "k" else {"h"} + ":mm" + if (amPm) " a" else {""}

    views.setCharSequence(R.id.clock_view, "setFormat12Hour", format)
    views.setCharSequence(R.id.clock_view, "setFormat24Hour", format)

    views.setTextColor(R.id.clock_view, color)
}

我有一个启动的服务,用于侦听首选项更改并接收广播意图,每当发生任何事情时它都会调用小部件的onUpdate()

在电池功能中一切正常:我可以使用配置活动来更改色调颜色以及是否显示百分比,并且更改会立即发生。但是,无论出于何种原因,clock 函数中的函数似乎都没有做任何事情。

当视图膨胀时,我已经设置了一种颜色来着色它,它仍然是白色的。如果我改变格式,什么都不会发生。就好像 TextClock 函数实际上没有被调用一样。

我什至检查了 AOSP 源,看起来应该允许 RemoteViews 对象中的这些方法:setFormat12Hour(CharSequence charSequence)

我做错了什么?

【问题讨论】:

    标签: android kotlin


    【解决方案1】:

    好吧,我想通了,老实说,我不知道为什么会这样。我注意到,当我向信息屏幕添加另一个小部件时,它也没有响应更改。所以我查看了两个损坏视图和一个工作视图(电池)之间的差异。

    我发现电池视图包含在 LinearLayout 中,您不知道吗,将 TextClock 和新的小部件(和 ImageView)包含在虚拟 LinearLayouts 中解决了这个问题:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="match_parent">
    
        <TextClock
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:gravity="center_vertical"
            android:padding="2dp"
            android:textSize="64px"
            android:id="@+id/textClock" />
    
    </LinearLayout>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-17
      相关资源
      最近更新 更多