如何在Android中限制Spinner下拉视图的高度

Tus*_*dey 27 android android-layout android-spinner

请建议我用来创建它的任何方法.

查询:我正在创建2-Spinner视图,其中我必须添加国家/城市列表,所以如果我选择印度然后我在下拉视图中获得50个项目,问题是它占据了整个页面身高.

我想要的是:我想创建一个下拉视图,用户只能在下拉视图中看到10个项目,只要用户滚动下拉视图,就会显示其他项目.


我的问题

shl*_*ee1 61

你可以使用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...
    }
Run Code Online (Sandbox Code Playgroud)

  • 对我不起作用,尽管代码调试和运行无一例外,但弹出高度不会改变 (8认同)
  • 还请解释源代码的重要部分,以改善您的答案并使其更有用. (4认同)
  • 它抛出异常 java.lang.ClassCastException: android.widget.Spinner$DropdownPopup cannot be cast to android.support.v7.widget.ListPopupWindow (2认同)

F.M*_*sir 8

从2021年开始,我会选择:并在以下内容Exposed Dropdown Menus中使用:AutoCompleteTextView

android:dropDownHeight="300dp"
Run Code Online (Sandbox Code Playgroud)

如果您不知道这是什么,请开始探索:菜单显示菜单文档


Alm*_*hty 7

您也可以通过影响继承下拉视图的位置和大小Spinner,并覆盖其getWindowVisibleDisplayFrame(Rect outRect)被使用android.widget.PopupWindow的计算.只需设置outRect为限制可以显示下拉视图的区域.

这种方法当然不适用于所有场景,因为有时您希望放置下拉视图,以便它不会模糊另一个视图或仅通过"实例外"知道的其他条件.

在我的情况下,我需要将FLAG_LAYOUT_NO_LIMITS标志应用于我的活动窗口,这导致了outRect巨大的,因此下拉视图的一部分有时隐藏在导航栏后面.为了恢复原始行为,我使用了以下覆盖:

@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);
}
Run Code Online (Sandbox Code Playgroud)


小智 6

简单的解决方案:

只需android:insetBottom="50dp"在以下位置设置弹出背景 xml 文件drawable

<--spinner_popup_bg.xml-->

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
    android:exitFadeDuration="@android:integer/config_mediumAnimTime">
    <item android:state_pressed="true" android:drawable="@android:color/white" />
    <item android:state_selected="true" android:drawable="@android:color/white" />
    <item>
        <inset android:insetLeft="5dp" android:insetRight="5dp" android:insetBottom="50dp">
            <shape android:shape="rectangle">
                <stroke android:width="1dp"
                    android:color="#001726" />
                <solid android:color="#FFFF" />
            </shape>
        </inset>
    </item>
</selector>
Run Code Online (Sandbox Code Playgroud)

对于spinner活动集中android:popupBackground="@drawable/spinner_popup_bg"

<Spinner
        android:id="@+id/myid"
...
        android:layout_width="300dp"
        android:layout_height="?attr/dropdownListPreferredItemHeight"
        android:popupBackground="@drawable/spinner_popup_bg"
...
        />
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述