使用 BroadcastReceiver 监视 BATTERY_CHANGED 并使用级别列表显示不起作用

发布于 2024-12-23 03:18:21 字数 2028 浏览 4 评论 0原文

大家好,我一直坚持这个问题,但我看不到我的错误。我之前基本上使用过将不同的可绘制对象绑定到特定级别,但是我尝试在监视电池变化的 BroadcastReceiver 中使用它,问题是当我调用 setImageLevel 更改时我没有得到任何 UI 更新?

广播接收器像这样

public class BatteryReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(LOG, "Fired Changed");
        int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
        int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100);

        int percent = (level * 100) / scale;

        imageBattery = (ImageView) findViewById(R.id.imageBatery);
        imageBattery.setImageLevel(percent);
        Log.d(LOG, "On UI running I am");

        // imageBattery.getDrawable().mutate();
        // imageBattery.invalidate();

        // Log.d(LOG,"DRawable: "+((LevelListDrawable)imageBattery.getDrawable()).getCurrent());

    }

}

显示日志,但它不会改变我的 ImageView 如果你能指出我正确的方向,或者你对这个问题有任何见解?

更多信息

这是我在与 BroadcastReceiver 相同的活动中进行的注册和取消注册

@Override
public void onResume() {
    super.onResume();
    IntentFilter filter = new IntentFilter();
    filter.addAction("android.intent.action.BATTERY_CHANGED");
    registerReceiver(receiver, filter);
}

@Override
public void onPause() {
    super.onPause();
    unregisterReceiver(receiver);
}

如何实例化 ImageView Drawable:

<ImageView
            android:id="@+id/imageBatery"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/battery_status" />

而且 Battery_status.xml 也是一个可绘制对象(我删除了一些可绘制项目,因为你明白我从 0-100 的想法

<item
    android:drawable="@drawable/stat_sys_battery_100"
    android:maxLevel="100"/>

<item
    android:drawable="@drawable/stat_sys_battery_90"
    android:maxLevel="90"/>

<item
    android:drawable="@drawable/stat_sys_battery_80"
    android:maxLevel="80"/>

Hello everyone I've been stick with this problem, and I can't see my mistake. I had used before basicly for having different drawable bind to a specific level, nevertheless I am trying to use it within a BroadcastReceiver wich monitor battery changes, the problem is that I don't get any UI update when I called the setImageLevel change?

The Broadcast Receiver goes like this

public class BatteryReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(LOG, "Fired Changed");
        int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
        int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100);

        int percent = (level * 100) / scale;

        imageBattery = (ImageView) findViewById(R.id.imageBatery);
        imageBattery.setImageLevel(percent);
        Log.d(LOG, "On UI running I am");

        // imageBattery.getDrawable().mutate();
        // imageBattery.invalidate();

        // Log.d(LOG,"DRawable: "+((LevelListDrawable)imageBattery.getDrawable()).getCurrent());

    }

}

The Log gets displayed but it does not change my ImageView if you can point me out in the right direction, or you have any insight on this issue?

Little bit of more info

Here is my Registration and unregistration both on the same activity as the BroadcastReceiver

@Override
public void onResume() {
    super.onResume();
    IntentFilter filter = new IntentFilter();
    filter.addAction("android.intent.action.BATTERY_CHANGED");
    registerReceiver(receiver, filter);
}

@Override
public void onPause() {
    super.onPause();
    unregisterReceiver(receiver);
}

How do I instatiate the ImageView Drawable:

<ImageView
            android:id="@+id/imageBatery"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/battery_status" />

And also battery_status.xml is a drawable (I removed some of the drawable item because you get the idea I have from 0-100)

<item
    android:drawable="@drawable/stat_sys_battery_100"
    android:maxLevel="100"/>

<item
    android:drawable="@drawable/stat_sys_battery_90"
    android:maxLevel="90"/>

<item
    android:drawable="@drawable/stat_sys_battery_80"
    android:maxLevel="80"/>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

白首有我共你 2024-12-30 03:18:21

您的 Activity 中是否内嵌了 BroadcastReceiver ?如果是这样,请使用 'MyActivity.this.runOnUiThread()` 方法来更改您的视图。

Do You have your BroadcastReceiver inlined in Your Activity? If so, use 'MyActivity.this.runOnUiThread()` method to change Your views.

素罗衫 2024-12-30 03:18:21

您的问题出在图像中,

当级别更改时,LevelListDrawable不会附加新图像,它只是显示您设置的级别的图像

尝试不同的图像,您会看到什么我是说

your problem is in images

LevelListDrawable doesn't append new image when level changed, it just shows the image for level you've set

try differen images and you'll see what I mean

黯然 2024-12-30 03:18:21

在你的 onCreate 中试试这个:

    imageBattery = (ImageView) findViewById(R.id.imageBatery);
    for (int i = 0; i < 10; i++) {
        imageBattery.setImageLevel(i * 10);
    }

是否改变了?

try this in your onCreate:

    imageBattery = (ImageView) findViewById(R.id.imageBatery);
    for (int i = 0; i < 10; i++) {
        imageBattery.setImageLevel(i * 10);
    }

is smth changed ?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文