Android:防止不同的微调高度(空和填充)

时间:2014-02-02 16:59:43

标签: android layout spinner adapter loader

我在布局上有一些微调器,并使用加载器在后台从db加载数据。问题是空的微调器在加载数据之前具有较小的高度。所以布局跳了。

如何防止这种跳跃?

编辑(添加微调器行布局)

Spinner row:

<?xml version="1.0" encoding="utf-8"?>
    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/Text1"
        style="@style/StyleSpinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

Spinner下拉行:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="@dimen/style_spinner_row_padding" >

    <TextView
        android:id="@+id/Text1"
        style="@style/StyleSpinnerDropDownRow1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true" />

    <TextView
        android:id="@+id/Text2"
        style="@style/StyleSpinnerDropDownRow2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/Text1" />

</RelativeLayout>

指定样式:

<!-- // Spinner // -->
<style name="StyleSpinner" parent="AppTheme">
    <item name="android:textStyle">bold</item>
    <item name="android:gravity">start</item>
    <item name="android:textSize">@dimen/default_text_size_normal</item>
    <item name="android:padding">@dimen/style_spinner_row_padding</item>
</style>

<style name="StyleSpinnerDropDownRow1" parent="AppTheme">
    <item name="android:textStyle">bold</item>
    <item name="android:textSize">@dimen/default_text_size_normal</item>
</style>

<style name="StyleSpinnerDropDownRow2" parent="AppTheme">
    <item name="android:textStyle">normal</item>
    <item name="android:textSize">@dimen/default_text_size_small</item>
</style>

截屏:

enter image description here enter image description here

3 个答案:

答案 0 :(得分:4)

我刚刚遇到了同样的问题,并设法为自己解决了问题,所以这就是我所做的。

我在我的微调器适配器中为每个项目布局充气 android.R.layout.simple_spinner_dropdown_item 。当我看到这个布局时,我注意到它没有边距,只有一个设置高度来自 android:attr / dropdownListPreferredItemHeight

所以我认为我会以编程方式获得此列表首选项高度值,并将其设置为我的微调器最小高度。使用this stackoverflow question的答案,我能够获得正确的值并将其设置为我的微调器。

    android.util.TypedValue value = new android.util.TypedValue();
    getActivity().getTheme().resolveAttribute(android.R.attr.listPreferredItemHeight, value, true);
    android.util.DisplayMetrics metrics = new android.util.DisplayMetrics();
    getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
    float ret = value.getDimension(metrics);

    mSpinner.setMinimumHeight((int) (ret - 1 * metrics.density));

我删除了1dip,因为似乎返回的值已经向上舍入,这使得1像素太高了。

现在我的所有微调器都是相同的高度,无论它们是有物品还是空的。

答案 1 :(得分:0)

为了防止高度从我在后台加载时的变化,我刚刚创建了一个无数组,并在xml中设置了条目:

在array.xml中

 <string-array name="none">
        <item></item>
 </string-array>

在微调器中

android:entries:@array/none

高度不会改变,因为一旦装载机完成,它就会替换旋转器的内容。

答案 2 :(得分:-1)

我使用了一个空数组的arrayAdapter<String>

获得所需内容后,只需获取新适配器或使用同一适配器并拨打notifyDataSetChanged()