如何使用数据绑定库绑定 android 中可以是 String 或 double 的变量?
How to bind a variable in android that can be a String or double with the data-binding-library?
对于我的 android 应用程序,我想读取 raspberry pi 的温度。从服务器,变量以双精度返回。从 XML 开始,它作为字符串返回。因此,我想我为什么不制作一个通用的 setter 来设置值,如果它是字符串或双精度值。
@Bindable
public String getCPUTemperature(){
return Double.toString(mCPUTemp);
}
/**
* Sets the CPU temperature for the device view model.
* @param <T> The generic parameter T accepts a String as wel as a Double to set the available memory.
*/
public <T> void setCPUTemperature(T CPUTemp){
if(CPUTemp.getClass().equals(String.class))
this.mCPUTemp = Double.parseDouble((String)CPUTemp);
else if(CPUTemp.getClass().equals(Double.class))
this.mCPUTemp = (double)CPUTemp;
notifyPropertyChanged(BR.cPUTemperature);
}
但是在我创建这个 setter 之后我发现:
Note: Arrays and a generic type, such as the Observable class, might display errors when there are no errors.
所以我开始怀疑。是否可以使用通用变量来解决它,如果可以,这是解决它的最佳方法吗?
听起来评论与 Android Studio 对数据绑定的支持有关。 Android Studio 对数据绑定的支持仍在改进中。当代码编译和运行正常时,它有时会显示警告或红色下划线。
你正在做的事情会奏效。您当前的方法根本不使用 T
,因此也可能是 Object
。我不认为你会从使用泛型中获得任何真正的优势。
你可以不用泛型来做,我认为它看起来更好:
public void setCPUTemperature(String CPUTemp){
this.mCPUTemp = Double.parseDouble((String)CPUTemp);
notifyPropertyChanged(BR.cPUTemperature);
}
public void setCPUTemperature(double CPUTemp){
this.mCPUTemp = CPUTemp;
notifyPropertyChanged(BR.cPUTemperature);
}
还有其他选择。例如,您可以在 XML:
中仅使用 double 然后进行快速字符串转换
public double getCPUTemperature(){
return this.mCPUTemp;
}
public void setCPUTemperature(double CPUTemp){
this.mCPUTemp = CPUTemp;
notifyPropertyChanged(BR.cPUTemperature);
}
然后在 XML:
<TextView android:text='@{"" + model.cPUTemperature}' .../>
<TextView android:text="@{Double.toString(model.cPUTemperature)}" .../>
<TextView android:text="@{@string/tempFormat(model.cPUTemperature)}" .../>
如果是我的应用程序,我会选择 @string/tempFormat
选项,这样我就可以轻松更改双精度的格式。我更喜欢在代码中避免硬编码格式,XML 是一个更好的地方。
对于我的 android 应用程序,我想读取 raspberry pi 的温度。从服务器,变量以双精度返回。从 XML 开始,它作为字符串返回。因此,我想我为什么不制作一个通用的 setter 来设置值,如果它是字符串或双精度值。
@Bindable
public String getCPUTemperature(){
return Double.toString(mCPUTemp);
}
/**
* Sets the CPU temperature for the device view model.
* @param <T> The generic parameter T accepts a String as wel as a Double to set the available memory.
*/
public <T> void setCPUTemperature(T CPUTemp){
if(CPUTemp.getClass().equals(String.class))
this.mCPUTemp = Double.parseDouble((String)CPUTemp);
else if(CPUTemp.getClass().equals(Double.class))
this.mCPUTemp = (double)CPUTemp;
notifyPropertyChanged(BR.cPUTemperature);
}
但是在我创建这个 setter 之后我发现:
Note: Arrays and a generic type, such as the Observable class, might display errors when there are no errors.
所以我开始怀疑。是否可以使用通用变量来解决它,如果可以,这是解决它的最佳方法吗?
听起来评论与 Android Studio 对数据绑定的支持有关。 Android Studio 对数据绑定的支持仍在改进中。当代码编译和运行正常时,它有时会显示警告或红色下划线。
你正在做的事情会奏效。您当前的方法根本不使用 T
,因此也可能是 Object
。我不认为你会从使用泛型中获得任何真正的优势。
你可以不用泛型来做,我认为它看起来更好:
public void setCPUTemperature(String CPUTemp){
this.mCPUTemp = Double.parseDouble((String)CPUTemp);
notifyPropertyChanged(BR.cPUTemperature);
}
public void setCPUTemperature(double CPUTemp){
this.mCPUTemp = CPUTemp;
notifyPropertyChanged(BR.cPUTemperature);
}
还有其他选择。例如,您可以在 XML:
中仅使用 double 然后进行快速字符串转换public double getCPUTemperature(){
return this.mCPUTemp;
}
public void setCPUTemperature(double CPUTemp){
this.mCPUTemp = CPUTemp;
notifyPropertyChanged(BR.cPUTemperature);
}
然后在 XML:
<TextView android:text='@{"" + model.cPUTemperature}' .../>
<TextView android:text="@{Double.toString(model.cPUTemperature)}" .../>
<TextView android:text="@{@string/tempFormat(model.cPUTemperature)}" .../>
如果是我的应用程序,我会选择 @string/tempFormat
选项,这样我就可以轻松更改双精度的格式。我更喜欢在代码中避免硬编码格式,XML 是一个更好的地方。