Android 微调器下拉式外边框

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

如何为整个下拉列表而不是项目本身设置边框

期望值

也许它看不清楚,但我对整个下拉列表外的白色边框感兴趣。见红色注释

现实

微调器_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>

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"