Top/Bottom 微调器的填充
Top/Bottom Padding for Spinner
如何为 Android 中的微调器指定 first/last 项的 top/bottom 上的额外填充?请参阅下面的 Goolge 示例(8 dp 间距)。
您需要使用自定义布局为您 Spinner
创建一个自定义适配器。因此,您只需要提供具有适当 margin/paddins.
的布局
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);
你可以找到一个有效的例子here。
只需为要在微调器中显示的项目创建一个单独的布局。
像这样
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" />
然后在您的 activity/fragment 中,您可以创建一个适配器(在本例中是一个简单的数组适配器)并将此布局传递给该适配器引用。最后将该适配器设置为微调器,您可以获得所需的结果。
示例代码。
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是您之前创建的布局文件。
您需要为此自定义适配器和自定义布局。
您可以使用 2 种布局。假设您有 n 个元素要显示,在您的微调器中您将有 n+2 个。如果位置为 0(第一个元素)或最后一个元素,您将显示空布局,否则您将显示其他布局。
您将用于创建此 space
的空布局
微调器不支持多种视图类型。Issue。
我建议您使用对话框来显示您的列表。
已编辑
根据您的评论解决了您的问题question
您可以使用 Spinner
的自定义 Adapter
来完成此操作。它看起来像这样:
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
或根据位置增加一些其他布局,但使用填充的解决方案对我来说似乎更自然。
您实际上不需要自定义适配器。以下解决方案完美运行。
创建可绘制对象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"
属性。
这就像一个魅力,没有任何被切断等。
如何为 Android 中的微调器指定 first/last 项的 top/bottom 上的额外填充?请参阅下面的 Goolge 示例(8 dp 间距)。
您需要使用自定义布局为您 Spinner
创建一个自定义适配器。因此,您只需要提供具有适当 margin/paddins.
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);
你可以找到一个有效的例子here。
只需为要在微调器中显示的项目创建一个单独的布局。
像这样
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" />
然后在您的 activity/fragment 中,您可以创建一个适配器(在本例中是一个简单的数组适配器)并将此布局传递给该适配器引用。最后将该适配器设置为微调器,您可以获得所需的结果。
示例代码。
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是您之前创建的布局文件。
您需要为此自定义适配器和自定义布局。 您可以使用 2 种布局。假设您有 n 个元素要显示,在您的微调器中您将有 n+2 个。如果位置为 0(第一个元素)或最后一个元素,您将显示空布局,否则您将显示其他布局。 您将用于创建此 space
的空布局微调器不支持多种视图类型。Issue。
我建议您使用对话框来显示您的列表。
已编辑
根据您的评论解决了您的问题question
您可以使用 Spinner
的自定义 Adapter
来完成此操作。它看起来像这样:
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
或根据位置增加一些其他布局,但使用填充的解决方案对我来说似乎更自然。
您实际上不需要自定义适配器。以下解决方案完美运行。
创建可绘制对象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"
属性。
这就像一个魅力,没有任何被切断等。