如何设置微调器下拉列表的最大长度?

我有一个微调,当打开时,微调下面的一些文字模糊。 我需要通过Java代码或通过XML来限制微调器的最大下拉长度,这样它就不会遮盖这个文本。

当前的devise是左边的例子,而期望的devise在右边。 说明

我怎样才能限制旋转开关在打开的时候下降多远? 目前,它下降,以填补下面的屏幕的整个部分。

  • Android - 框架布局高度与协调器布局不匹配
  • 我如何pipe理android微调项目的高度?
  • GridLayoutManager中的不同(dynamic)项目高度
  • 如何从平均海平面计算以上海拔高度
  • 一种方法是使用ActionBarSherlock的IcsSpinner。 我做了必要的修改,以限制微调的大小,似乎很好地工作。

    对IcsListPopupWindow进行以下修改。

    添加一个实例variables:

    private int mDropDownVerticalOffsetBottom; 

    添加一个方法来设置这个variables:

     public void setVerticalOffsetBottom(int offsetBottom) { mDropDownVerticalOffsetBottom = offsetBottom; } 

    将getMaxAvailableHeight调用更改为(添加了mDropDownVerticalOffsetBottom):

     final int maxHeight = /*mPopup.*/getMaxAvailableHeight( mDropDownAnchorView, mDropDownVerticalOffset, mDropDownVerticalOffsetBottom, ignoreBottomDecorations); 

    将方法的签名更改为包含该variables:

     private int getMaxAvailableHeight(View anchor, int yOffset, int yOffsetBottom, boolean ignoreBottomDecorations) { 

    计算到底部的距离时考虑偏移:

     final int distanceToBottom = bottomEdge - (anchorPos[1] + anchor.getHeight()) - yOffset - yOffsetBottom; 

    现在修改IcsSpinner.java来实现offset的setter方法:

     private DropdownPopup mPopup; // <- needs to be a DropdownPopup instead of a SpinnerPopup public void setVerticalOffsetBottom(int offsetBottom) { mPopup.setVerticalOffsetBottom(offsetBottom); } 

    现在“所有”您需要做的是将偏移量设置为正确的值。 这是我做的(我testing了它,它在两个testing设备上工作):

     final View root = findViewById(R.id.root_layout); final View view = findViewById(R.id.view_not_to_be_obscured); root.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { public void onGlobalLayout() { root.getViewTreeObserver().removeGlobalOnLayoutListener(this); int[] locations = new int[2]; root.getLocationOnScreen(locations); int y1 = locations[1]; int h1 = root.getHeight(); view.getLocationOnScreen(locations); int y2 = locations[1]; int offset = y1 + h1 - y2; // here we initialize the spinner } }); 

    假设是,root_layout填充整个窗口,不包括所有的装饰元素。

    最后一步是创buildSpinner本身:

      // actionDropDownStyle is an attribute set in the theme to eg @style/Widget.Sherlock.Spinner.DropDown.ActionBar or @style/Widget.Sherlock.Light.Spinner.DropDown.ActionBar for light theme IcsSpinner spinner = new IcsSpinner(context, null, R.attr.actionDropDownStyle); // yes here we set the offset! spinner.setVerticalOffsetBottom(offset); spinner.setPadding(spinner.getPaddingLeft(), 0, spinner.getPaddingRight(), 0); spinner.setId(R.id.some_id); spinner.setAdapter(yourAdapter); // you can use a simple ArrayAdapter or whatever you need // create ICS LinearLayout LayoutInflater inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE ); IcsLinearLayout linearLayout = (IcsLinearLayout) inflater.inflate(R.layout.abs__action_bar_tab_bar_view, null); linearLayout .setPadding(listNavLayout.getPaddingLeft(), 0, listNavLayout.getPaddingRight(), 0); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); params.gravity = Gravity.CENTER; linearLayout .addView(spinner, params); 

    现在可能看起来很复杂,但是像其他人提到的那样,如果没有你自己的微调实现,你将无法实现这一点,因为ActionBarSherlock带有一个,为什么不使用它呢? 这当然比写自己的工作less。 如果您不使用该库的ActionBar去掉所有不需要的资源文件,并使用Proguard去除所有未使用的类。 你可能可以使用AppCompat实现相同的function(请参阅https://github.com/android/platform_frameworks_support/tree/master/v7/appcompat/src/android/support )。

    我search了很多,似乎我无法find解决这个问题的任何地方。 你可能不得不通过重新创build一个微调器的function,但使用button和对话框intead稍微不同的路线。

    假设你正在使用微调的ArrayAdapter ,试试这个:

    使用具有向下箭头图标的buttonreplace您的微调器。

    创build一个自定义的DialogAlertDialog并用ArrayAdapter填充一个ListView 。 对于onClick方法,推送所选选项的值并填充一个staticvariables和button的文本与选定的值。 这样,您可以使对话框的大小任意大小,多余的select总是可以滚动的。

    我知道这并不理想,但我还没有find任何方法来改变微调器“下拉”部分的高度。

    对不起,如果这不是你所希望的。

    编辑:其他人问前面这个完全相同的问题,事实certificate,他们用我刚刚描述的确切方法。 你可以看到他们在这里使用的示例代码: 检查问题/代码

    微调设置的大小有android:layout_width =“wrap_content”由其内容决定。 如果你想要的东西ellipsized,这是由你的SpinnerAdapter,当你创build你的行视图。

    或者,硬连接一个固定大小的android:layout_width。

    或者,不是使用LinearLayout,而是使用RelativeLayout并构造规则,以便Spinner通过将其锚定到屏幕的左侧和第一个EditText的左侧来占用行的剩余空间。 虽然我不是100%确定如果内容太大会发生什么,它可能只是被截断。

    我认为你必须使用自定义微调你的要求。没有任何内置的方法或XML属性可以帮助。

    看到这个例子的帮助。

    https://github.com/ankitthakkar/DropDownSpinner

    希望这会工作。

    注意:这是改变的答案。