2

是否可以使 Holo DatePicker 和 TimePicker 更小​​或减少填充/边距?当我Theme.Holo.Light.Dialog用作样式时,我无法让元素适合屏幕。如果我使用Theme.Dialog它的风格,一切都合适。

这是 HTC One V 上出现的对话框(请原谅手机的图片,我无法保存屏幕截图):

在此处输入图像描述

您可以看到按钮在底部被剪裁。如果DatePicker&TimePicker不占用太多空间,它会很合适。

这是 Galaxy S4 上出现的对话框(供参考):

在此处输入图像描述

这就是Theme.DialogHTC 上的显示方式(您可以看到没有浪费空间):

在此处输入图像描述

4

3 回答 3

3

我发现的最简单的解决方案是:将负边距设置为日期/时间选择器视图。

<DatePicker
        android:id="@+id/date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:calendarViewShown="false"
        android:datePickerMode="spinner"
        android:layout_marginTop="-32dp"
        android:layout_marginBottom="-32dp"
        tools:ignore="UnusedAttribute"/>
于 2015-06-29T09:24:52.903 回答
2

问题肯定来自屏幕的大小,并且 Holo 只定义了一种带有原始边距的布局(在 DP 中)。

通过将布局 XML 文件导入项目的资源中来覆盖此处的布局 XML 文件。确保将文件保存在与手机屏幕尺寸对应的文件夹中。

然后,您会很高兴地更改布局属性,例如边距。

于 2014-01-30T18:21:28.070 回答
1

对于 Holo TimePicker,您可以使用它。

public static void setTimePickerHeightTopBottomMargin(
        TimePicker timePicker, int height, int topMargin, int bottomMargin) {

    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
        try {
            Field f;
            View v;
            ViewGroup.MarginLayoutParams params;
            // mHourSpinner
            f = TimePicker.class.getDeclaredField("mHourSpinner");
            f.setAccessible(true);
            v = (View) f.get(timePicker);
            params = (ViewGroup.MarginLayoutParams) v.getLayoutParams();
            params.height = height;
            params.topMargin = topMargin;
            params.bottomMargin = bottomMargin;
            // mMinuteSpinner
            f = TimePicker.class.getDeclaredField("mMinuteSpinner");
            f.setAccessible(true);
            v = (View) f.get(timePicker);
            params = (ViewGroup.MarginLayoutParams) v.getLayoutParams();
            params.height = height;
            params.topMargin = topMargin;
            params.bottomMargin = bottomMargin;
            // mAmPmSpinner
            f = TimePicker.class.getDeclaredField("mAmPmSpinner");
            f.setAccessible(true);
            v = (View) f.get(timePicker);
            params = (ViewGroup.MarginLayoutParams) v.getLayoutParams();
            params.height = height;
            params.topMargin = topMargin;
            params.bottomMargin = bottomMargin;
        } catch (Exception e) {
            Log.w(TAG, e);
        }
    }
}

单位是像素,因此请确保从 dp 转换。不要使用小于 120dp 的高度。

保持高度并移除垂直边距通常就足够了:

setTimePickerHeightTopBottomMargin(mTimePicker,
        ViewGroup.LayoutParams.WRAP_CONTENT, 0, 0);

虽然我没有测试过它,但 DatePicker 应该是相同的,而是使用对 fields 的反射mDaySpinnermMonthSpinnermYearSpinner不是。

于 2014-08-11T20:37:56.510 回答