如何改变打开的微调器的位置?

我希望旋转器下拉菜单在旋转器本身正下方打开。 例如:

在此处输入图像描述

如何设置微调器下拉的位置?

将微调器模式声明为下拉列表:

android:spinnerMode="dropdown" 

然后使用垂直偏移来缩小差距:

 android:dropDownVerticalOffset="-15dp" 

Spinner Android文档

您必须扩展Spinner并更改AlertDialog的位置(单击时微调器充当alertDialog)。

代码(不仅仅是位置,它还为打开的微调器设置背景):

 public class CustomSpinner extends Spinner { private AlertDialog mPopup; public CustomSpinner(Context context) { super(context); } public CustomSpinner(Context context, AttributeSet attrs) { super(context, attrs); } public CustomSpinner(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); if (mPopup != null && mPopup.isShowing()) { mPopup.dismiss(); mPopup = null; } } //when clicked alertDialog is made @Override public boolean performClick() { Context context = getContext(); AlertDialog.Builder builder = new AlertDialog.Builder(context); CharSequence prompt = getPrompt(); if (prompt != null) { builder.setTitle(prompt); } mPopup = builder.setSingleChoiceItems( new DropDownAdapter(getAdapter()), getSelectedItemPosition(), this).show(); WindowManager.LayoutParams WMLP = mPopup.getWindow().getAttributes(); //width and height must be set to anything other than WRAP_CONTENT! WMLP.x = 0; // x position WMLP.y = 50; // y position WMLP.height =390 ; //LayoutParams.WRAP_CONTEN WMLP.width = 315; WMLP.horizontalMargin = 0; WMLP.verticalMargin = 0; mPopup.getWindow().setAttributes(WMLP); //ListView.getDefaultSize(size, measureSpec) ListView listView = mPopup.getListView(); //listView.set // Remove divider between rows listView.setDivider(null); // Set custom background listView.setBackgroundResource(R.drawable.drop); // Remove background from all (grand)parent's ViewParent parent = listView.getParent(); while (parent != null && parent instanceof View) { ((View) parent).setBackgroundDrawable(null); parent = parent.getParent(); } return true; } @Override public void onClick(DialogInterface dialog, int which) { setSelection(which); dialog.dismiss(); mPopup = null; } * 

Wrapper class for an Adapter. Transforms the embedded Adapter instance * into a ListAdapter.

*/ private static class DropDownAdapter implements ListAdapter, SpinnerAdapter { private SpinnerAdapter mAdapter; /** *

Creates a new ListAddapter wrapper for the specified adapter.

* * @param adapter the Adapter to transform into a ListAdapter */ public DropDownAdapter(SpinnerAdapter adapter) { this.mAdapter = adapter; } public int getCount() { return mAdapter == null ? 0 : mAdapter.getCount(); } public Object getItem(int position) { return mAdapter == null ? null : mAdapter.getItem(position); } public long getItemId(int position) { return mAdapter == null ? -1 : mAdapter.getItemId(position); } public View getView(int position, View convertView, ViewGroup parent) { return getDropDownView(position, convertView, parent); } public View getDropDownView(int position, View convertView, ViewGroup parent) { return mAdapter == null ? null : mAdapter.getDropDownView(position, convertView, parent); } public boolean hasStableIds() { return mAdapter != null && mAdapter.hasStableIds(); } public void registerDataSetObserver(DataSetObserver observer) { if (mAdapter != null) { mAdapter.registerDataSetObserver(observer); } } public void unregisterDataSetObserver(DataSetObserver observer) { if (mAdapter != null) { mAdapter.unregisterDataSetObserver(observer); } } /** *

Always returns false.

* * @return false */ public boolean areAllItemsEnabled() { return true; } /** *

Always returns false.

* * @return false */ public boolean isEnabled(int position) { return true; } public int getItemViewType(int position) { return 0; } public int getViewTypeCount() { return 1; } public boolean isEmpty() { return getCount() == 0; } } }

然后你只需要使用“yourPackage.CustomSpinner”元素将它插入你的布局:

   

对于下拉 Spinner模式,您可以使用:

 mSortingSpinner.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { mSortingSpinner.setDropDownVerticalOffset( mSortingSpinner.getDropDownVerticalOffset() + mSortingSpinner.getHeight()); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) { mSortingSpinner.getViewTreeObserver().removeOnGlobalLayoutListener(this); } else { mSortingSpinner.getViewTreeObserver().removeGlobalOnLayoutListener(this); } } }); 

这通过微调器高度设置下拉垂直偏移。