Android 微调器下拉式外边框
如何为整个下拉列表而不是项目本身设置边框 期望值: 也许它看不清楚,但我对整个下拉列表外的白色边框感兴趣。见红色注释 现实: 微调器_item.xml:Android 微调器下拉式外边框,android,android-layout,android-spinner,Android,Android Layout,Android Spinner,如何为整个下拉列表而不是项目本身设置边框 期望值: 也许它看不清楚,但我对整个下拉列表外的白色边框感兴趣。见红色注释 现实: 微调器_item.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:lay
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/primary_blue_dark">
<TextView
android:id="@+id/tv_spinner_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="12dp"
android:gravity="center_vertical|start"
style="@style/sp_squared_style"/>
<ImageView
android:id="@+id/iv_underline"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginRight="12dp"
android:layout_marginLeft="12dp"
android:layout_marginBottom="6dp"
android:background="@drawable/ic_underline"/>
</LinearLayout>
在Drawable文件夹下创建一个border.xml文件,并编写以下代码
<?xml version="1.0" encoding="utf-8"?>
我希望它能帮助你……:) 在Drawable文件夹下创建一个border.xml文件,并编写以下代码
<?xml version="1.0" encoding="utf-8"?>
我希望它能帮助你……:) 您需要在drawable文件夹中创建一个单独的XML文件
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/white_overlay_8x" />
<corners android:radius="6dip" />
<stroke
android:color="@color/white"
android:width="@dimen/dot" />
</shape>
在spinner_item.xml:中,您需要在drawable文件夹中创建一个单独的xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/primary_blue_dark">
<TextView
android:id="@+id/tv_spinner_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="12dp"
android:gravity="center_vertical|start"
style="@style/sp_squared_style"/>
<ImageView
android:id="@+id/iv_underline"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginRight="12dp"
android:layout_marginLeft="12dp"
android:layout_marginBottom="6dp"
android:background="@drawable/ic_underline"/>
</LinearLayout>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/white_overlay_8x" />
<corners android:radius="6dip" />
<stroke
android:color="@color/white"
android:width="@dimen/dot" />
</shape>
在spinner_item.xml中:找到了解决此问题的方法。不确定,也许有更好的解决办法。无论如何:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/primary_blue_dark">
<TextView
android:id="@+id/tv_spinner_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="12dp"
android:gravity="center_vertical|start"
style="@style/sp_squared_style"/>
<ImageView
android:id="@+id/iv_underline"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginRight="12dp"
android:layout_marginLeft="12dp"
android:layout_marginBottom="6dp"
android:background="@drawable/ic_underline"/>
</LinearLayout>
1) spinner\u item.xml
-在布局中包装内容
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/grey_stroke" //add white border
>
<LinearLayout
android:id="@+id/ll_wrapper"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="1dp" //set margin left and right
android:layout_marginRight="1dp" //add bottom and top margins dynamically in adapter
android:orientation="vertical"
android:background="@color/primary_blue_dark">
<TextView
android:id="@+id/tv_spinner_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/activity_vertical_margin_small"
android:gravity="center_vertical|start"
style="@style/sp_squared_style"/>
<ImageView
android:id="@+id/iv_underline"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/activity_vertical_margin_small"
android:layout_marginLeft="@dimen/activity_vertical_margin_small"
android:layout_marginBottom="6dp"
android:background="@drawable/ic_underline"/>
</LinearLayout>
2) 为适配器中的第一个元素和底部元素添加底部边距:
public class AmountAdapter extends ArrayAdapter<String> {
private TextView tvRow;
private TextView tvItem;
private LinearLayout llWrapper;
private Context context;
private ImageView ivUnderline;
private String[] values;
private int border;
public AmountAdapter(Context context, int textViewResourceId,
String[] values) {
super(context, textViewResourceId, values);
this.context = context;
this.values = values;
border = (int) context.getResources().getDimension(R.dimen.rounding_radius_dp_1);
}
public int getCount() {
return values.length;
}
public String getItem(int position) {
return values[position];
}
public String[] getItems() {
return values;
}
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(context);
View row;
row = inflater.inflate(R.layout.item_spinner_row, parent, false);
tvRow = (TextView) row.findViewById(R.id.tv_spinner_row);
return row;
}
@Override
public View getDropDownView(final int position, View convertView,
ViewGroup parent) {
View row;
row = View.inflate(context, R.layout.item_spinner_dropdown, null);
llWrapper = (LinearLayout) row.findViewById(R.id.ll_wrapper);
tvItem = (TextView) row.findViewById(R.id.tv_spinner_item);
tvItem.setText(values[position]);
ivUnderline = (ImageView) row.findViewById(R.id.iv_underline);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT
);
if (position == values.length - 1){
ivUnderline.setVisibility(View.GONE);
int padding = (int)context.getResources().getDimension(R.dimen.activity_vertical_margin_small);
int paddingTop = (int)context.getResources().getDimension(R.dimen.rounding_radius_dp);
tvItem.setPadding(padding, paddingTop, 0, padding);
params.setMargins(border, 0, border, border); //end part
llWrapper.setLayoutParams(params);
} else if(position == 0){
params.setMargins(border, border, border, 0); //start part
llWrapper.setLayoutParams(params);
} else {
params.setMargins(border, 0, border, 0); //middle part
llWrapper.setLayoutParams(params);
}
return row;
}
}
公共类AmountAdapter扩展了ArrayAdapter{
私有文本视图tvRow;
私有文本视图项目;
私人线路布局;
私人语境;
私有图像视图;
私有字符串[]值;
私人国际边界;
public AmountAdapter(上下文,int textViewResourceId,
字符串[]值){
super(上下文、textViewResourceId、值);
this.context=上下文;
这个值=值;
border=(int)context.getResources().getDimension(R.dimen.rounding\u radius\u dp\u 1);
}
public int getCount(){
返回值.length;
}
公共字符串getItem(int位置){
返回值[位置];
}
公共字符串[]getItems(){
返回值;
}
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
LayoutFlater充气机=LayoutFlater.from(上下文);
查看行;
行=充气机。充气(R.layout.item\u spinner\u行,父项,false);
tvRow=(TextView)row.findViewById(R.id.tv\u微调器\u row);
返回行;
}
@凌驾
公共视图getDropDownView(最终整数位置,视图转换视图,
视图组(父级){
查看行;
行=视图.充气(上下文,R.layout.item\u微调器\u下拉列表,null);
llWrapper=(LinearLayout)row.findviewbyd(R.id.ll\u wrapper);
tvItem=(TextView)row.findViewById(R.id.tv\u微调器\u项目);
tviitem.setText(值[位置]);
ivUnderline=(ImageView)row.findViewById(R.id.iv_underline);
LinearLayout.LayoutParams params=新的LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_父级,
LinearLayout.LayoutParams.WRAP_内容
);
if(位置==values.length-1){
ivUnderline.setVisibility(View.GONE);
int padding=(int)context.getResources().getDimension(R.dimen.activity\u vertical\u margin\u small);
int paddingTop=(int)context.getResources().getDimension(R.dimen.rounding\u radius\u dp);
设置填充(padding,paddingTop,0,padding);
params.setMargins(border,0,border,border);//结束部分
llWrapper.setLayoutParams(params);
}否则如果(位置==0){
params.setMargins(border,border,border,0);//开始部分
llWrapper.setLayoutParams(params);
}否则{
params.setMargins(border,0,border,0);//中间部分
llWrapper.setLayoutParams(params);
}
返回行;
}
}
3) 结果:
找到了解决此问题的方法。不确定,也许有更好的解决办法。无论如何: 1)
spinner\u item.xml
-在布局中包装内容
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/grey_stroke" //add white border
>
<LinearLayout
android:id="@+id/ll_wrapper"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="1dp" //set margin left and right
android:layout_marginRight="1dp" //add bottom and top margins dynamically in adapter
android:orientation="vertical"
android:background="@color/primary_blue_dark">
<TextView
android:id="@+id/tv_spinner_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/activity_vertical_margin_small"
android:gravity="center_vertical|start"
style="@style/sp_squared_style"/>
<ImageView
android:id="@+id/iv_underline"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/activity_vertical_margin_small"
android:layout_marginLeft="@dimen/activity_vertical_margin_small"
android:layout_marginBottom="6dp"
android:background="@drawable/ic_underline"/>
</LinearLayout>
2) 为适配器中的第一个元素和底部元素添加底部边距:
public class AmountAdapter extends ArrayAdapter<String> {
private TextView tvRow;
private TextView tvItem;
private LinearLayout llWrapper;
private Context context;
private ImageView ivUnderline;
private String[] values;
private int border;
public AmountAdapter(Context context, int textViewResourceId,
String[] values) {
super(context, textViewResourceId, values);
this.context = context;
this.values = values;
border = (int) context.getResources().getDimension(R.dimen.rounding_radius_dp_1);
}
public int getCount() {
return values.length;
}
public String getItem(int position) {
return values[position];
}
public String[] getItems() {
return values;
}
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(context);
View row;
row = inflater.inflate(R.layout.item_spinner_row, parent, false);
tvRow = (TextView) row.findViewById(R.id.tv_spinner_row);
return row;
}
@Override
public View getDropDownView(final int position, View convertView,
ViewGroup parent) {
View row;
row = View.inflate(context, R.layout.item_spinner_dropdown, null);
llWrapper = (LinearLayout) row.findViewById(R.id.ll_wrapper);
tvItem = (TextView) row.findViewById(R.id.tv_spinner_item);
tvItem.setText(values[position]);
ivUnderline = (ImageView) row.findViewById(R.id.iv_underline);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT
);
if (position == values.length - 1){
ivUnderline.setVisibility(View.GONE);
int padding = (int)context.getResources().getDimension(R.dimen.activity_vertical_margin_small);
int paddingTop = (int)context.getResources().getDimension(R.dimen.rounding_radius_dp);
tvItem.setPadding(padding, paddingTop, 0, padding);
params.setMargins(border, 0, border, border); //end part
llWrapper.setLayoutParams(params);
} else if(position == 0){
params.setMargins(border, border, border, 0); //start part
llWrapper.setLayoutParams(params);
} else {
params.setMargins(border, 0, border, 0); //middle part
llWrapper.setLayoutParams(params);
}
return row;
}
}
公共类AmountAdapter扩展了ArrayAdapter{
私有文本视图tvRow;
私有文本视图项目;
私人线路布局;
私人语境;
私有图像视图;
私有字符串[]值;
私人国际边界;
public AmountAdapter(上下文,int textViewResourceId,
字符串[]值){
super(上下文、textViewResourceId、值);
this.context=上下文;
这个值=值;
border=(int)context.getResources().getDimension(R.dimen.rounding\u radius\u dp\u 1);
}
public int getCount(){
返回值.length;
}
公共字符串getItem(int位置){
返回值[位置];
}
公共字符串[]getItems(){
返回值;
}
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
LayoutFlater充气机=LayoutFlater.from(上下文);
查看行;
行=充气机。充气(R.layout.item\u spinner\u行,父项,false);
tvRow=(TextView)row.findViewById(R.id.tv\u微调器\u row);
返回行;
}
@凌驾
公共视图getDropDownView(最终整数位置,视图转换视图,
视图组(父级){
查看行;
行=视图.充气(上下文,R.layout.item\u微调器\u下拉列表,null);
llWrapper=(LinearLayout)row.findviewbyd(R.id.ll\u wrapper);
tvItem=(TextView)row.findViewById(R.id.tv\u微调器\u项目);
tviitem.setText(值[位置]);
ivUnderline=(ImageView)row.findViewById(R.id.iv_underline);
LinearLayout.LayoutParams params=新的LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_父级,
LinearLayout.LayoutParams.WRAP_内容
);
if(位置==values.length-1){
ivUnderline.setVisibility(View.GONE);
int padding=(int)context.getResources().getDimension(R.dimen.activity\u vertical\u margin\u small);
int paddingTop=(int)context.getResources().getDimension(R.dimen.rounding\u radius\u dp);
设置填充(padding,paddingTop,0,padding);
params.setMargins(border,0,border,border);//结束部分
llWrapper.setLay
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/itemText"/>
</LinearLayout>
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;
public class CustomListAdapter extends ArrayAdapter<CustomListItem> {
private Context context;
public CustomListAdapter(Context context, List<CustomListItem> items) {
super(context, R.layout.spinner_list_item, items);
this.context = context;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// spinner layout (when closed)
int layoutId = R.layout.spinner_view;
return createView(position, convertView, parent, layoutId);
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
// dropdown list layout
int layoutId = R.layout.spinner_list_item;
return createView(position, convertView, parent, layoutId);
}
private View createView(int position, View convertView, ViewGroup parent, int layoutId) {
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(layoutId, null);
}
TextView itemText = convertView.findViewById(R.id.itemText);
CustomListItem item = getItem(position);
if (item != null) {
itemText.setText(item.getText());
}
return convertView;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<solid android:color="@color/basic_color"/>
<stroke
android:width="2dp"
android:color= "@color/border_color"/>
</shape>
<Spinner
android:id="@+id/spinner"
android:layout_width="0dp"
android:layout_height="50dp"
...
android:spinnerMode="dropdown"
android:popupBackground="@drawable/spinner_dropdown_border" />
android:popupBackground="@drawable/spinner_dropdown_border"