我有一个类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);