2017-03-01 33 views
1

對於我的android應用程序,我想讀取我的覆盆子pi的溫度。從服務器,變量返回爲double。從XML中,它以字符串形式返回。所以我想爲什麼我不能創建一個通用的setter,如果它是一個String或double,就可以設置該值。如何在android中綁定一個可以是String或double的變量與數據綁定庫?

@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); 
} 

但經過我創造了這個二傳手我發現:

注:當沒有錯誤數組和泛型類型,如可觀察類,可能會顯示錯誤。

所以我開始懷疑。是否有可能用一個通用變量來解決它,如果是這樣,是解決它的最好方法嗎?

回答

2

這聽起來像評論與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:

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選項這樣我就可以輕鬆地改變double的格式。我更喜歡避免在代碼中使用硬編碼格式,而XML是一個更好的地方。

+0

這是我正在尋找的答案。我對View中的代碼格式化了懷疑,而不是ViewModel。但看到這個之後,我傾向於認爲它是更好的地方,因爲它也導致了更少的代碼,並且應該更容易維護。 – user3473161