代码之家  ›  专栏  ›  技术社区  ›  TheWanderer

AppWidget中的TextClock未响应任何函数调用

  •  1
  • TheWanderer  · 技术社区  · 7 年前

    我正在为LG V20/V10开发一个信息小部件,在第二个屏幕上运行(添加一个很容易:只需将您的类别设置为36864/0x9000)。目前,我在RemoteView布局中有一个电池视图和一个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() 无论什么时候发生什么事。

    电池功能一切正常:我可以使用“配置”活动更改色调颜色以及是否显示百分比,并立即进行更改。然而,不管出于什么原因,时钟函数中的函数似乎没有什么作用。

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

    我甚至检查了AOSP源,看起来应该允许从RemoteViews对象使用以下方法: setFormat12Hour(CharSequence charSequence)

    我做错了什么?

    1 回复  |  直到 7 年前
        1
  •  0
  •   TheWanderer    7 年前

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

    我发现电池视图包含在线性布局中,您难道不知道吗,将TextClock和新小部件(以及ImageView)包含在虚拟线性布局中修复了这个问题:

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