【问题标题】:Strange XML layout bug when targeting Android 4.3针对 Android 4.3 时出现奇怪的 XML 布局错误
【发布时间】:2013-09-11 20:55:40
【问题描述】:

在针对 API 级别 18 构建应用程序时,我遇到了一个非常特殊的 XML 布局文件错误。API 级别 17 不会发生这种情况。我在 Android 4.3 设备上运行该应用程序,并且该错误在所有三台设备上都存在。

它是这样的:

API 17(正确):

API 18(不正确):

我用的是StickyGridHeaders library,下面是我的getHeaderView()方法:

@Override
public View getHeaderView(int position, View convertView, ViewGroup parent) {
    RowItem holder;

    if (convertView == null) {
        convertView = inflater.inflate(R.layout.seasons_row_header, parent, false);
        holder = new RowItem();
        holder.title = (TextView) convertView.findViewById(R.id.seasonTitle);
        holder.episodeCount = (TextView) convertView.findViewById(R.id.episodeCount);
        convertView.setTag(holder);
    } else {
        holder = (RowItem) convertView.getTag();
    }

    if (seasons.get(position).equals("00")) {
        holder.title.setText(R.string.stringSpecials);  
    } else {
        holder.title.setText(getString(R.string.showSeason) + " " + seasons.get(position));
    }

    int size = seasonEpisodeCount.get(Integer.valueOf(seasons.get(position)));
    holder.episodeCount.setText(size + " " + getResources().getQuantityString(R.plurals.episodes, size, size));

    convertView.setClickable(false);
    convertView.setFocusable(false);

    return convertView;
}

这是布局 XML 文件:

<?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:background="#80000000"
    android:padding="@dimen/list_padding" >

    <TextView
        android:id="@+id/seasonTitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_marginRight="@dimen/list_padding"
        android:layout_toLeftOf="@+id/episodeCount"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textIsSelectable="false"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/episodeCount"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/seasonTitle"
        android:layout_alignParentRight="true"
        android:layout_alignTop="@+id/seasonTitle"
        android:gravity="bottom"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:textIsSelectable="false" />

</RelativeLayout>

还有其他人知道这里发生了什么吗?我发现它在以 API 级别 17 为目标时有效,而在以最新的 API 级别 (18) 为目标时无效。

更新:

这是在以 Android 4.3 为目标的可视化布局编辑器中的样子:

【问题讨论】:

  • 你试过删除这个:android:layout_toLeftOf="@+id/episodeCount" 我知道有时交叉引用位置会导致奇怪的行为......
  • 我刚试过。它使 TextView 出现,但另一个呈现在它之上:-(
  • 这是一个开始... :) 尝试从 episodeCount 文本视图中的 @+id/seasonTitle 中删除“+”
  • 没有尝试,我怀疑这会奏效。需要 + 来创建 ID。
  • 提醒任何遇到此问题(或类似问题)的人:它似乎与 RelativeLayout 如何在滚动容器中处理 MeasureSpec.UNSPECIFIED 的更新行为有关(即 @ 987654332@ 或 ListView)。阅读RelativeLayout documentation中的注释了解更多详情,并参考#59700 on the Android issue tracker

标签: android android-xml android-4.3-jelly-bean


【解决方案1】:

我自己解决了这个问题。

就像我说的,我正在使用 StickyGridHeaders 库并在我的应用程序中引用它。该库似乎针对 API 级别 17。我将其更改为级别 18,编译并运行应用程序 - 非常成功!

结论:确保您的应用程序和库面向相同的 API 级别。

【讨论】:

    【解决方案2】:

    我也有同样的问题。 我的经验表明,交叉对齐是问题的原因(TextView @+id/seasonTitle 具有属性 android:layout_toLeftOf="@+id/episodeCount "; TextView @+id/episodeCount 具有 android:layout_alignBottom="@+id/seasonTitle" 属性>layout_alignTop="@+id/seasonTitle"。其中一个布局不会正确刷新其子级。 更改 Layout-XML 会阻止交叉对齐,您不再有此问题。

    【讨论】:

      【解决方案3】:

      我也有同样的问题:

      • 一个白色背景的 ListView
      • 在 RelativeLayout 中,每个孩子都有一个灰色背景、宽度和高度与父级匹配的 View

      在 API 17 上,一切正常 在 API 18+ 上,ListView 是白色的

      我没有设置固定的高度,而是在视图中放了一个 min_height,问题(暂时)解决了!

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-09
        • 2013-10-12
        相关资源
        最近更新 更多