我有一個應用程序使用NumberPicker
s。由於該應用支持較舊版本的Android,但尚未提供NumberPicker
小部件,因此我必須使用external library。爲什麼將net.simonvt.numberpicker.NumberPicker強制轉換爲android.widget.NumberPicker?
在我的XML佈局numberpicker_dialog.xml
,我定義了NumberPicker
這樣的:
<net.simonvt.numberpicker.NumberPicker
android:id="@+id/interval_picker_1"
... />
然後在我的活動的代碼,我有:
import net.simonvt.numberpicker.NumberPicker;
private View intervalPickerDialogBody;
private NumberPicker intervalPicker1;
private android.widget.NumberPicker api11_intervalPicker1;
protected void onCreate(Bundle savedInstanceState) {
intervalPickerDialogBody = getLayoutInflater()
.inflate(R.layout.numberpicker_dialog, null);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
// the casting in question happens here
api11_intervalPicker1 = (android.widget.NumberPicker)
intervalPickerDialogBody.findViewById(R.id.interval_picker_1);
} else {
intervalPicker1 = (NumberPicker)
intervalPickerDialogBody.findViewById(R.id.interval_picker_1);
}
}
它的工作原理,真正的蜂窩並較新版本,使用android.widget.NumberPicker
,在舊版本中使用net.simonvt.numberpicker.NumberPicker
。
但現在,我正在寫有關使用此應用的論文,我在想:
- 爲什麼從XML佈局鑄造
net.simonvt.numberpicker.NumberPicker
當他們在現實中是不同類android.widget.NumberPicker
工作? - 爲什麼只有這種鑄造使設備在Honeycomb上使用
android.widget.NumberPicker
而在XML佈局中的NumberPicker
實際上是來自exetrnal庫的設備時更新?什麼時候創建android.widget.NumberPicker
的實例?
是android.widget.NumberPicker
用在蜂窩和更新是由事實forecoming代碼片段的第二行我4.0.3手機等於true
支持的事實。
View tmp = intervalPickerDialogBody.findViewById(R.id.interval_picker_1);
tmp instanceof android.widget.NumberPicker // pseudocode
(謝謝你,朱爾斯,這比刪除線用一個箭頭一個更好的證明。:))
如果有人想知道我是怎麼知道的
android.widget.NumberPicker
實際上是在Honeycomb和較新的使用,這是因爲
net.simonvt.numberpicker.NumberPicker
不顯示箭頭上方和下方的箭頭,因爲它已從4.2中移除,箭頭已被刪除。當我在運行4.0.3的設備上嘗試它時,即使它應該顯示
net.simonvt.numberpicker.NumberPicker
,它們也不會顯示,但箭頭仍然存在。
我希望這個問題是可以理解的。感謝您對這個主題的闡述。
謝謝你的闡述。我猜你是對的。問題是即使使用你的代碼,如果'LayoutInflater'的錯誤得到解決,應用程序很可能會崩潰,因爲我的應用程序後來指望'api11_intervalPicker1'在蜂窩或更新版本上運行時被初始化......我想我會只需要一種更好的方式來在不同的Android版本中使用具有相同名稱的不同類。我現在就會這樣離開它,因爲它是一個無人使用的應用程序。 – zbr 2013-05-13 15:25:20