在開發(fā)中,如果有選項卡場景,而選項卡選項較多時,使用Dialog會產(chǎn)生大量的代碼,每一個按鈕都需要進行單獨的事件監(jiān)聽,多少有些影響代碼美觀和可閱讀性.
Spinner「列表選項卡」
Spinner的出現(xiàn)解決了這個問題,它的使用十分簡潔,使用少量代碼即可完成對每一個選項卡的事件監(jiān)聽.
Spinner有兩個,二者其實并沒有什么太大的差別,只是v7的Spinner向下兼容,一直兼容到api7(Android2.1),分別如下:
<Spinner
android:layout_width="24dp"
android:layout_height="24dp"
android:entries="@array/spinner_integral"
android:textColor="#fff">
</Spinner>
<androidx.appcompat.widget.AppCompatSpinner
android:layout_width="24dp"
android:layout_height="24dp"
android:entries="@array/spinner_integral"
android:textColor="#fff">
</androidx.appcompat.widget.AppCompatSpinner>
Spinner選項卡內(nèi)的選項,需要在values文件夾下的arrays.xml文件內(nèi)聲明.
<string-array name="spinner_integral">
<item>《操作菜單》</item>
<item>分享</item>
<item>查看效果</item>
<item>修改庫存</item>
<item>下架</item>
<item>操作記錄</item>
</string-array>
對選項卡內(nèi)選項的監(jiān)聽
spinner.setOnItemSelectedListener(object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(
parent: AdapterView<*>?,
view: View,
position: Int,
id: Long
) {
if (position == 0) {
} else if (position == 1) {
} else if (position == 2) {
} else if (position == 3) {
} else if (position == 4) {
} else if (position == 5) {
}
}
override fun onNothingSelected(parent: AdapterView<*>?) {}
})
在使用Spinner時,數(shù)據(jù)加載除了在arrays.xml中聲明外,還可以使用適配器進行數(shù)據(jù)加載,這樣我們可以對數(shù)據(jù)進行動態(tài)改動,對于固定的選項卡,arrays.xml就完全足夠使用了.
在Spinner使用時,會出現(xiàn)多次點擊相同選項卡,除第一次點擊生效,其他點擊不生效的情況,是因為Spinner組件會判斷點擊位置與上一次點擊是否相同,相同時不會觸發(fā)事件.也就是說,只要本次點擊與上一次點擊的選項卡不同,就可以避免這個問題.
我的處理方式是在選項卡頭或尾多添加一張選項卡,每次處理完成事件后,用代碼將Spinner的指針放到多出來的卡片上
spinner.setSelection(0)
我們也可以使用反射來更改Spinner的指針,但這樣稍顯麻煩,且可能會引起異常,我并不推薦
new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView arg0, View arg1,
int arg2, long arg3) {
// TODO Auto-generated method stub
try {
Field field = AdapterView.class.getDeclaredField("mOldSelectedPosition");
field.setAccessible(true); //設置mOldSelectedPosition可訪問
field.setInt(spinner, AdapterView.INVALID_POSITION); //設置mOldSelectedPosition的值
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onNothingSelected(AdapterView arg0) {
}
};