Android Spinner - 如何调整当前所选项目的大小?

时间:2012-11-01 02:51:26

标签: android android-spinner

似乎旋转器的大小适合其适配器中给出的最长项目。对于大多数情况来说,这是一种很好的行为,但在我的特定情况下这是不可取的。

这可以关闭吗?我的猜测不是,通过查看源代码中的Spinner.onMeasure(),但我想问。

4 个答案:

答案 0 :(得分:4)

我现在通过继承Spinner来实现这一点:

public class SpinnerWrapContent extends IcsSpinner {
    private boolean inOnMeasure;

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {       
         inOnMeasure = true;
         super.onMeasure(widthMeasureSpec, heightMeasureSpec);
         inOnMeasure = false;
    }

    public boolean isInOnMeasure() {
        return inOnMeasure;
    }
}

然后在我的SpinnerAdapter的getView()中,如果从onMeasure()调用我,则使用当前选择的位置:

    public View getView(int position, View convertView, ViewGroup parent) {
        View view;

        if (convertView != null)
            view = convertView;
        else {
            int fixedPosition = (spinner.isInOnMeasure() ? spinner.getSelectedItemPosition() : position);

            // Here create view for fixedPosition
        }

        return view;
    }

答案 1 :(得分:1)

这对我有用。重要的是这个。将上面的代码放在你的适配器上,并使用selectedItemPosition从objects数组中选择文本。

int selectedItemPosition = position;
    if (parent instanceof AdapterView) {
        selectedItemPosition = ((AdapterView) parent)
                .getSelectedItemPosition();
    }

示例如下。

public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = getLayoutInflater();
    final View spinnerCell;
    if (convertView == null) {
        // if it's not recycled, inflate it from layout
        spinnerCell = inflater.inflate(R.layout.layout_spinner_cell, parent, false);
    } else {
        spinnerCell = convertView;
    }
    int selectedItemPosition = position;
    if (parent instanceof AdapterView) {
        selectedItemPosition = ((AdapterView) parent)
                .getSelectedItemPosition();
    }

    TextView title = (TextView) spinnerCell.findViewById(R.id.spinnerTitle);
    title.setText(titles[selectedItemPosition]);
    return spinnerCell;
}

如果您需要说明,请点击此链接:http://coding-thoughts.blogspot.in/2013/11/help-my-spinner-is-too-wide.html

答案 2 :(得分:0)

如果你想让Spinner更短,那么这很容易解决。

通常,您可以通过赋予权重或设置layout_width和layout_height来更改任何视图的高度和宽度:

<Spinner
    android:id="@+id/shortenedSpinner"
    android:layout_width="100dp"
    android:layout_height="50dp" />

这会强制微调器缩短

如果您希望下拉视图更短,那就不同了。 在这种情况下,我想你可以在微调器适配器的getDropDownView()方法中提供一个自定义行,它具有与上述相同的更改。

答案 3 :(得分:0)

如果有人正在寻找 Kotlin 的答案,请按以下方式操作。

class DynamicSizeSpinner : androidx.appcompat.widget.AppCompatSpinner {

    var inOnMeasure = false
        private set

    constructor(context: Context) : super(context)
    constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
    constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr)

    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        inOnMeasure = true
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
        inOnMeasure = false
    }
}
class SpinnerArrayAdapter(context: Context,@LayoutRes layout: Int, val entries: List<String>) : ArrayAdapter<String>(context, layout, entries) {

    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
        val selectedItemPosition = when (parent) {
            is AdapterView<*> -> parent.selectedItemPosition
            is DynamicSizeSpinner -> parent.selectedItemPosition
            else -> position
        }
        return makeLayout(selectedItemPosition, convertView, parent, R.layout.simple_spinner_dropdown_item_custom)
    }

    override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View {
        return makeLayout(position, convertView, parent, R.layout.simple_spinner_dropdown_item_custom)
    }

    private fun makeLayout(position: Int, convertView: View?, parent: ViewGroup, layout: Int): View {
        val view = convertView ?: LayoutInflater.from(context).inflate(layout, parent, false)
        if (position != -1) {
            (view as? TextView)?.text = entries[position]
        }
        return view
    }
}

使用 DynamicSizeSpinner,就像在 XML/JAVA/Kotlin 代码中使用默认 Spinner 一样。

P.S 不要忘记阅读original article