Spinner的顶部/底部填充

16

如何在 Android 中为一个下拉列表(spinner)指定首/末项的上/下方额外填充?参考 Google 的示例(8 dp 间距),如下图所示:

Google Simple Menu

尝试下面的链接:第一个链接 第二个链接 示例程序 希望这些能帮到您。 - user5346283
6个回答

4
你需要为你的Spinner创建一个自定义适配器,使用你自己的布局。因此,你只需要提供一个具有适当边距/填充的布局即可。
Spinner spinner = (Spinner) findViewById(R.id.myspinner);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.data, R.layout.spinner_item);
adapter.setDropDownViewResource(R.layout.spinner_dropdown_item);
spinner.setAdapter(adapter);
您可以在这里找到一个有效的示例。

4

Spinner不支持多种视图类型。问题

我建议您使用对话框来显示列表。

根据您的评论,您可以通过这个问题解决您的问题。


唯一的解决方案似乎是这个。我在你提供的链接中找到了它。https://dev59.com/4HHYa4cB1Zd3GeqPPsfJ#16400899 - multiholle

1

只需为您想要在下拉列表中显示的项创建单独的布局。

就像这样:

spinner_text_view.xml

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/customTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="15dp"
android:text="@string/sample_list_item"
android:textColor="@android:color/black"
android:textSize="20sp" />

然后在您的活动/片段中,您可以创建一个适配器(在这种情况下,为了简单起见,使用数组适配器),并将该布局传递给该适配器引用。最后将该适配器设置为微调器,您就可以获得所需的结果。

示例代码。

private void setupSpinner() {
    String[] sampleSpinnerItems = {"One", "Two", "Three", "Four", "Five"};
    ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(this,
            R.layout.spinner_text_view, sampleSpinnerItems);
    sampleSpinner.setAdapter(spinnerAdapter);
}    

希望这有所帮助。 注意:spinner_text_view是您之前创建的布局文件。

这不会在第一个和最后一个项目之前给我额外的填充。 - multiholle

1
你可以使用自定义的Adapter来完成这个操作,针对Spinner。它会像这样:
class YourAdapter extends BaseArrayAdapter<YourObject> {

    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.your_item, parent, false);
            DropDownViewHolder holder = new DropDownViewHolder();
            holder.root = convertView.findViewById(R.id.drop_down_root);
            // other assignments etc.
            convertView.setTag(holder);
        }
        DropDownViewHolder holder = (DropDownViewHolder) convertView.getTag();
        int bottomPadding = 0;
        int topPadding = 0;
        if (position == 0) {
            topPadding = getContext().getResources().getDimensionPixelSize(R.dimen.margin_8);
        } else if (position == (getCount() - 1)) {
            bottomPadding = getContext().getResources().getDimensionPixelSize(R.dimen.margin_8);
        }

        holder.root.setPadding(0, topPadding, 0, bottomPadding);
        // other UI related logic etc.
        return convertView;
    }

    // ...

    public static class DropDownViewHolder {
        View root;
        // other views
    }
}

实际上,通过设置额外的填充来处理逻辑可以改为更改一些存根视图的可见性为VISIBLE或者根据位置填充其他布局,但是对我来说,填充的解决方案似乎更加自然。

1
你需要自定义适配器和布局。你可以使用2个布局。假设你有n个元素要显示,在你的下拉列表中,你将有n+2个选项。如果位置是0(第一个元素)或最后一个元素,你将显示空布局,否则你将显示另一个布局。你将使用空布局来创建这个空间。

0

实际上,您不需要为此使用自定义适配器。以下解决方案完美地解决了这个问题。

创建一个可绘制的 bg_spinner.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners android:radius="3dp" />
    <padding
        android:bottom="8dp"
        android:top="8dp" />
    <solid android:color="yourPopupColor" />
</shape>

然后在XML中为您的Spinner设置android:popupBackground="@drawable/bg_spinner_popup"属性。这样做非常顺利,不会有任何被切断的情况发生。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接