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

2024-04-19

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

The current design is the left example while the desired design is on the right. explanation

如何限制旋转器打开时下降的距离?目前,它会下降以填充其下方的整个屏幕部分。


实现此目的的一种方法是使用动作栏夏洛克 http://actionbarsherlock.com/的 IcsSpinner。我做了必要的修改来限制旋转器的大小,这似乎工作得很好。

对 Ics ListPopupWindow 进行以下修改。

添加实例变量:

private int mDropDownVerticalOffsetBottom;

添加一个方法来设置此变量:

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

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

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

更改方法的签名以包含该变量:

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

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

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

现在修改 IcsSpinner.java 来实现偏移量的 setter 方法:

private DropdownPopup mPopup;   // <- needs to be a DropdownPopup instead of a SpinnerPopup

public void setVerticalOffsetBottom(int offsetBottom) {
    mPopup.setVerticalOffsetBottom(offsetBottom);
}

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

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 填充整个窗口,不包括所有装饰元素。

最后一步是创建微调器本身:

    // actionDropDownStyle is an attribute set in the theme to e.g. @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 附带了一个,为什么不使用它呢?这肯定比自己编写一个工作量要少。如果您不使用 ActionBar 的库,请删除所有不需要的资源文件,并使用 Proguard 删除所有未使用的类。 您可能可以使用 AppCompat 实现相同的目标(请参见此处:https://github.com/android/platform_frameworks_support/tree/master/v7/appcompat/src/android/support https://github.com/android/platform_frameworks_support/tree/master/v7/appcompat/src/android/support).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 不同 Android 设备上 box2D 中出现奇怪的“口吃”

    我正在用 C 同时开发引擎和游戏 并使用 box2D 作为物理后端 我正在不同的 Android 设备上进行测试 在三分之二的设备上 游戏运行良好 物理效果也很好 然而 在我的 Galaxy Tab 10 1 上 我偶尔会遇到某种 口吃 的
  • Android自定义控件命名空间问题

    我一直在为 Android 开发自定义控件 尽管我尝试按照建议进行操作here https stackoverflow com questions 4495511 how to pass custom component parameter
  • 在代码中旋转按钮(或其中的文本)

    我必须通过编码随机旋转按钮 或里面的文本 它是相同的 API级别低于11是否有button setRotate x 好吧 看了一下 答案是 很复杂 您可以使用旧的动画框架旋转按钮 例如像这样 Button button Button fin
  • 导航组件参数默认值

    在导航组件中 将参数从第一个片段发送到第二个片段时 默认值不会从导航图中获取哪个集合 这是我的代码 导航图 xml
  • 毕加索磁盘缓存

    我正在使用 Picasso 从 URL 加载图像 Picasso with getApplicationContext load product getImageUrl into imageView 据我所知 每次都会访问该网址 而不是缓存
  • Android ListView 自定义适配器 ImageButton

    这可能不是正确的方法 如果有更好的方法请告诉我 我创建了一个自定义适配器类 在我的 getView 方法中我膨胀了我想要使用的视图 public View getView int position View convertView View
  • Android 5.0 Lollipop 中屏幕固定关闭时如何收到通知?

    我有一个在后台运行的应用程序 并在手机上发生特定事件时启动活动 我发现在 Android 5 0 中 当用户使用另一个应用程序打开屏幕固定时 startActivity intent 调用将被完全忽略 我的应用程序不知道该活动尚未启动 因此
  • 如何忽略 LeakCanary 中的某些类?

    有人能给我一个如何忽略 LeakCanary 中的某些类的有效示例吗 我正在查看这个示例 以忽略 LeakCanary 中第三方库中的某些类 但我不知道将其放在应用程序中的何处 我把它放在我的应用程序类中 但这些变量和方法有错误 isInA
  • Android 中有没有办法获取 SD 卡大小?

    欢迎大家 我已经在 Stackoverflow 和 google 上尝试过与此相关的每个问题 但没有一个有效 我已经尝试过类似下一个链接的操作 但它返回的内容与内部存储相同 如何获取外部存储 SD 卡的大小 带安装的 SD 卡 https
  • 我的 Android 设备需要安装哪个驱动程序才能运行我的应用程序?

    我购买了 intex mobile 来在真实设备中测试我的 Android 应用程序 然而 该设备不存在于 OEM USB 驱动程序列表中 android 提供的设备列表中 我检查了 intex 官方网站 但不确定到底需要安装哪个驱动程序
  • 如何更改对话框片段内的片段

    我想做一个空的DialogFragment with a LinearLayout然后更改里面的片段LinearLayout 例如 第一个片段是 3 个按钮 facebook google 电子邮件登录 的登录 当有人按下电子邮件时 第 2
  • 如何在android中画一条曲线?

    我是 Android 新手 正在开发一个关于绘制线条的示例项目 我想画一条连接两点的曲线或高架线 x1 y1 and x2 y2 我试过canvas drawArc 方法 但是RectF内的值drawArc方法只是圆的 x y 中心点 它在
  • 如何知道用户是否在 Android 应用程序中输入了错误的密码(锁定屏幕)

    我正在开发一个 Android 应用程序 如果用户在 Android 锁定屏幕中输入错误的密码 则必须完成其中一项活动 例如 如果用户输入错误的密码 则会发送电子邮件 我将不胜感激任何帮助 提前致谢 Kshitij 锁屏在完全沙箱环境中运行
  • 在 android 中,第一次单击时按钮侦听器未注册

    因为我是 Android 新手 所以我遇到了按钮监听器的问题 我正在使用 OnClickListener 来处理胸像 但它第一次点击后不执行一旦我单击多个 它就会表现良好 但如何使其在第一次单击时成为可能 这是我的代码 public cla
  • 如何在 kotlin 中检查 lambda 空值

    在 Kotlin 中如何检查 lambda 是否为空 例如 我有这样的签名 onError Throwable gt Unit 我如何区分它的默认值是应用于主体还是应用于此函数的值 您无法测试 lambda 的主体是否为空 因此它不包含源代
  • 如何在 onDraw() 方法中定义与像素无关的高度

    我扩展了 View 来构建自定义小部件 我想用独立的像素单位定义小部件的高度 我认为可以通过将像素密度乘以所需的高度来完成 但我不知道该怎么做 到目前为止我所拥有的 最小化 public class Timeline extends Vie
  • 从 sqlite 和 mysql 加载数据微调器

    我试试这个tutorial http nielpoenya blogspot com 2012 08 tutorial android spinner dari database html加载Spinner from sqlite and
  • 制作弹跳动画

    我想做图层的弹跳动画 我已经完成了该图层从右到中心的操作 现在我想将其向后移动一点 然后回到中心 这会产生反弹效果 我想我可以用这样的翻译来做到这一点
  • Application.onLowMemory() 未调用

    我创建了自己的应用程序类 我尝试调试它 代码在 Application onCreate 处停止 但不会在 onLowMemory 处停止 为了测试该场景 我打开了许多其他高内存应用程序 我看到的是调试会话终止 在 Eclipse 中 并且
  • 在android中使用BaseActivity的不同活动中的通用标头

    我想编写一次代码并在不同的活动中使用 我创建了一个Base Activity class为了那个原因 此外 不同活动中所有布局的标题都是相同的 我在以下人员的帮助下做到了这一点

随机推荐

  • jQuery 加载到变量

    我需要将 jQuery 加载结果插入到变量中 页面 ajax html 上带有 id 测试的元素的内容 result load ajax html test 尝试使用jQuery get http api jquery com jQuery
  • 如何将 NSMutableOrderedSet 转换为通用数组?

    我有这个for循环 p is a NSManagedObject fathers is a to many关系 所以我需要投射NSMutableOrderedSet to Family 但它不起作用 为什么 for f in p fathe
  • 查找向量中最接近的值

    我想要完成的是迭代双精度值向量并返回最接近的可能双精度值的向量位置 我对此有两个问题 当尝试使用以下命令查找向量中最接近的双精度值时lower bound 如果我输入 1 我只会收到非零的值 我不知道如何使用lower bound返回向量位
  • 在 `git rebase --update-refs` 之后自动推送

    Git 2 38 引入了 update refs标记为 rebase 命令 如果您有一个分支链 它将更新链中的所有分支 当我将大型 PR 分解为更容易审查的 PR 时 我发现这非常有用 然而 之后git rebase update refs
  • 将组名称获取到星号中相应的 pri 端口

    我正在使用 sagoma 8 端口卡 我的chan dahdi conf配置端口是 autogenerated by usr sbin wancfg dahdi do not hand edit autogenrated on 2015 0
  • Excel 单元格在双击之前不会计算

    我有一个包含三个求和函数的 Excel 工作表 该工作表是一个模板 因此除了 A 列中的一些文本描述外 工作表的其余部分是空白的 我使用 ETL 流程 Talend Open Studio 打开工作表 输入一些数据 附加几个其他工作表 并将
  • 如何从连接到同一网络的另一台计算机打开 create-react-app?

    我在用创建反应应用程序并托管在其默认端口本地主机 3000并希望从同一网络上的另一台设备访问它 我得到了我的主机IP的IP 使用ifconfig 192 168 0 5并尝试打开192 168 0 5 3000但这没有用 有什么办法可以实现
  • Laravel - 如何获取特定用户的委托角色

    我正在用 Laravel 做一个小工作并使用齐扎科信托公司 以管理员身份登录时我想查看全部Roles特定用户的 我搜索了一段时间但没有找到任何线索 我怎样才能使用Entrust或者我应该使用 SQL 查询吗 在您的 User 类中添加 pu
  • Windows 服务器上的 PTP 同步(与 Linux 相比) - 可以保证什么精度

    我想知道大家是否知道准确度如何PTP http en wikipedia org wiki Precision Time Protocol在 Windows Server 2008 上可以保证同步 我知道这个线程 Windows 中进程的最
  • 访问 Google Chrome 的缓存

    是否可以从扩展程序中访问 Google Chrome 的缓存 我想编写一个扩展 当无法访问在线页面时 例如互联网连接问题 加载页面的缓存版本 Updated 我知道我可以编写一个可通过扩展访问的 NPAPI 插件来完成此任务 但我不想编写一
  • Firestore 客户和发票,修订后的要求

    这个问题是此处发布的问题的后续问题 Firestore 客户和发票 如何建模 https stackoverflow com questions 50867267 firestore clients and invoices how to
  • C++ 错误:没有调用“print_size”的匹配函数

    我有这个代码 include
  • 为什么函数 printk() 不使用逗号来分隔参数?

    一个例子printk call printk KERN INFO Log message n 也许这个问题更多地是关于C的 因为我之前从未见过C中的函数可以不用逗号分隔参数 这是如何运作的 编译器如何处理这些信息 由于日志级别是一个整数 而
  • 在没有正确原型的情况下调用 printf 是否会引发未定义的行为?

    这个看起来无辜的程序是否会调用未定义的行为 int main void printf d n 1 return 0 是的 调用printf 没有适当的原型 来自标准头
  • python:单行笛卡尔积for循环

    你知道你能做到吗 gt gt gt x y for x in xrange 2 for y in xrange 5 0 0 0 1 0 2 0 3 0 4 1 0 1 1 1 2 1 3 1 4 很整洁 是否有 for 循环版本或者只能对列
  • Flash AS3 - 将多个对象拖放到一个目标?

    标题或多或少是不言自明的 我一直在学习许多不同的教程 而且说实话 我对 AS3 不太擅长 上图显示了我的目标 无论如何 我在我看到的大多数在线教程中注意到 拖放教程要么基于一个对象到一个目标 要么基于多个对象到多个目标 所以我想知道是否有人
  • 如何让php函数每5秒循环一次

    我正在尝试创建一个每秒更新一次的 php 函数 使用 php 本身 没有其他语言 只是纯 PHP 代码 function exp do something 我希望它每秒返回一个值 就像每秒更新一样 对于应用程序服务器 不是 Web 服务器
  • 让 WordPress 使用页面而不是类别

    我做了大量的研究并发现了一些像这样的解决方案 https wordpress stackexchange com questions 106042 force wordpress to show pages instead of categ
  • VS 2008 Addon 暂时禁用/删除所有 catch 块

    是否有任何插件可以暂时禁用所有 catch 块 我正在维护一个应用程序 我需要找出它到底在哪里抛出异常 有人已经完成了错误处理 所有层都完成了 这使我的工作变得艰难 我不知道如何禁用 catch 块 但您想要实现的目标可以通过异常对话框中的
  • 如何设置微调器下拉列表的最大长度?

    我有一个微调器 当前打开时会遮挡微调器下方的一些文本 我需要通过 java 代码或 XML 来限制微调器的最大下拉长度 这样它就不会模糊此文本 The current design is the left example while the