数据绑定到字段,显示匹配的图标



我有一个类WifiManager,它持有一个布尔值,表示wifi连接wifi断开

布尔字段更新为我在该类中的broadcastReceiver

private BroadcastReceiver wifiScanReceiver;
private boolean isWifiConnected = false;
wifiScanReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context c, Intent intent) {
                    // Wifi connected/disconnected
                    NetworkInfo nwInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
                    final WifiInfo connectionInfo = wifiManager.getConnectionInfo();
                    if (nwInfo.getState().equals(NetworkInfo.State.CONNECTED)) {
                        // wifi connect
                        isWifiConnected = true;
                    } else {
                        // wifi disconnected
                        isWifiConnected = false;
                    }
                }
        };
        context.registerReceiver(wifiScanReceiver, wifiIntentFilter);

在我的MainActivity中,我有一个WifiManager字段,我想做的是数据绑定,这将根据布尔值 ->更改菜单项之一,如果isWifiConnected=false设置图标为@drawalbe/xxx,如果isWifiConnected=true设置图标为@drawalbe/yyy

含义-对isWifiConnected值的变化有某种"监听器",并基于此-将MenuItem的一个图标设置为@drawalbe/xxx@drawalbe/yyy

我知道有很多方法可以做到这一点,从在BroadcastReceiver中广播Intent并在MainActivity中捕获它,到每3秒运行Handler并检查isWifiConnected .

真正寻找的是与转换器的数据绑定,就像您在MVVM项目中所做的那样。

android中有这样的东西吗?

我假设你知道android数据绑定,你只是问如何为这个特定的情况。如果没有,这里是android数据绑定指南。

您将需要一种方法来观察布尔值,以便UI可以保持更新。最简单的方法是将其作为模型对象的ObservableBoolean字段:

public class ViewModel {
    public final ObservableBoolean isWifiConnected = new ObservableBoolean();
    // other things you want to bind to your layout...
}

当您创建绑定时,您还必须分配模型:

public void onCreate(Bundle icicle) {
    ActivityMainBinding binding =
        DataBindingUtil.setContentView(this, R.layout.activity_main);
    this.model = new ViewModel();
    binding.setModel(this.model);
}

当你收到广播时,你更新模型:

wifiScanReceiver = new BroadcastReceiver() {
        //...
        model.isWifiConnected.set(newValue);
        //...
    };

你的布局应该是这样的:

<layout ...>
    <data>
        <variable name="model" type="com.example.ViewModel"/>
    </data>
    <!-- rest of layout -->
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@{model.isWifiConnected ? @drawable/xxx : @drawable/yyy}"/>
</layout>

如果您跟踪绑定并直接在其上设置变量,您还可以避免使用模型类。在这种情况下,您将拥有一个变量:

<variable name="isWifiConnected" type="boolean"/>

你的广播接收器会设置值:

binding.setIsWifiConnected(newValue);

最新更新