Spinner选择并取消选择

时间:2014-07-23 13:33:46

标签: android android-layout android-spinner

第一张图片显示未选中时的微调器。

当选择微调器时,我想改变它的样式,使其看起来如下图所示。

enter image description here

enter image description here

3 个答案:

答案 0 :(得分:0)

我想上面没有这样的直接方法。但您可以采用布局,将图像设置为背景。在该布局上获取imageview&在该布局的点击监听器上更改箭头图像&同时显示listview点击该布局&双击使列表视图不可见。

见下文:

布局(具有背景图像) - > Imageview(箭头/ s) - >弹出列表视图 - >使其可见/不可见

答案 1 :(得分:0)

您需要在布局XML文件上使用android:spinnerSelector,然后检查 this

答案 2 :(得分:0)

很久以前,您曾经能够指定android:spinnerSelector property for Spinners,但不幸的是,该属性已被删除,并且不再适用。

不幸的是,唯一的另一种方法(AFAIK)是扩展Spinner类。这是因为为了按照您想要的方式更改背景,您需要确定是否打开或关闭Spinner。没有内置方法可以检测到这一点,因此您需要将其构建为自定义Spinner类。

在自定义微调器类中,您将检测何时按下并打开微调器,以及通过取消对话框或选择项目来关闭对话框。

我在写这个答案时大量提到了following answer(复制粘贴了很多代码然后修改它供你使用)。请参考它。我通过消除使用监听器界面来改变了这个答案,因为你不在乎知道点击何时发生,你只想要改变背景。如果您想在活动中使用该信息,请重新添加监听器。

首先,在新文件CustomSpinner.java

中创建自定义微调器
public class CustomSpinner extends Spinner {

    private boolean mOpenInitiated = false;

    // the Spinner constructors
    // add all the others too, I'm just putting one here for simplicity sake
    public CustomSpinner(Context context){
        super(context);
        setBackgroundResource(R.drawable.CLOSE_SPINNER_DRAWABLE);
    }

    @Override
    public boolean performClick() {
        // register that the Spinner was opened so we have a status
        // indicator for the activity(which may lose focus for some other
        // reasons)
        mOpenInitiated = true;
        setBackgroundResource(R.drawable.OPENED_SPINNER_DRAWABLE);
        return super.performClick();
    }

    /**
     * Propagate the closed Spinner event to the listener from outside.
     */
    public void performClosedEvent() {
        mOpenInitiated = false;
        setBackgroundResource(R.drawable.CLOSED_SPINNER_DRAWABLE);
    }

    /**
     * A boolean flag indicating that the Spinner triggered an open event.
     * 
     * @return true for opened Spinner 
     */
    public boolean hasBeenOpened() {
        return mOpenInitiated;
    }

}

在您的Activity中创建自定义微调器(可能在onCreate中),并覆盖onWindowFocusChanged以告诉微调器取消通知您关闭事件(如果它已打开)。

CustomSpinner mSpin;

@Override
public void onCreate(Bundle savedInstanceState){
    // Do all your initialization stuff
    mSpin = (CustomSpinner) findViewById(R.id.myCustomSpinner);

    // shouldn't need this if you are setting initial background in the constructors
    mSpin.setBackgroundResource(R.drawable.CLOSED_SPINNER_DRAWABLE); 
}

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    // mSpin is our custom Spinner
    if (mSpin.hasBeenOpened() && hasFocus) {
        mSpin.performClosedEvent();
    }
}

此微调器的xml资源将如下所示(注意:我只向此XML文件添加了几个参数,由于没有宽度,高度或对齐参数,它肯定不完整。)

<com.packagename.CustomSpinner 
    android:id="@+id/myCustomSpinner"
/>

希望这有所帮助,对不起,这太复杂了。我可能已经查看了一个更简单的解决方案,但我进行了广泛的搜索,无法找到任何正常工作的内容。