How to limit the height of Spinner drop down view in Android
You can also affect drop down view location and size by subclassing Spinner
and overriding its getWindowVisibleDisplayFrame(Rect outRect)
which is used by android.widget.PopupWindow
for calculations. Just set outRect
to limit the area where drop down view can be displayed.
This approach is of course not suitable for all scenarios since sometimes you want to place drop down view so it doesn't obscure another view or by some other condition known only "outside the instance".
In my case, I needed to apply FLAG_LAYOUT_NO_LIMITS
flag to my activity window which caused the outRect
to be huge and therefore part of the drop down view got sometimes hidden behind navigation bar. In order to restore original behavior I used the following override:
@Override
public void getWindowVisibleDisplayFrame(Rect outRect) {
WindowManager wm = (WindowManager) getContext.getSystemService(Context.WINDOW_SERVICE);
Display d = wm.getDefaultDisplay();
d.getRectSize(outRect);
outRect.set(outRect.left, <STATUS BAR HEIGHT>, outRect.right, outRect.bottom);
}
As of year 2021 I would go with: Exposed Dropdown Menus
and use inside AutoCompleteTextView
the following:
android:dropDownHeight="300dp"
If you don't know what is this all about start exploring: Menu-Display & Menu-Documentation
You can use Reflection.
Spinner spinner = (Spinner) findViewById(R.id.spinner);
try {
Field popup = Spinner.class.getDeclaredField("mPopup");
popup.setAccessible(true);
// Get private mPopup member variable and try cast to ListPopupWindow
android.widget.ListPopupWindow popupWindow = (android.widget.ListPopupWindow) popup.get(spinner);
// Set popupWindow height to 500px
popupWindow.setHeight(500);
}
catch (NoClassDefFoundError | ClassCastException | NoSuchFieldException | IllegalAccessException e) {
// silently fail...
}