【问题标题】:Android Lollipop Design IssueAndroid Lollipop 设计问题
【发布时间】:2015-06-28 12:43:52
【问题描述】:

我有一个带有高度参数match_parentRelativeLayout,在这个我有另一个带有属性layout_alignParentBottom=trueLinearLayout

我正在使用此布局来显示 MediaController 按钮。

以下是我期望在MediaController 中拥有的内容

但下面是我在Lollipop 5.1 上得到的内容(我刚刚在布局中添加了硬编码的底部边距,这根本不是任何解决方案,因为它不适用于所有设备。)

布局隐藏在底部后退按钮栏的后面

根据底栏的高度仅从底部提供必要的边距的最佳方法是什么,因为这种布局在其他 Android 版本和带有硬件后退按钮的早期 Android 手机中运行良好。

我的 XML 文件如下所示

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.mypack.MyActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/bottomLinear"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/albumArt"
            android:layout_width="120dp"
            android:layout_height="120dp"
            android:layout_gravity="center"
            android:background="@drawable/default_cover" />

        <TextView
            android:id="@+id/titleOfSong"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:maxLines="3"
            android:text="Title Of Song"
            android:textSize="18sp" />

        <TextView
            android:id="@+id/albumOfSong"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:maxLines="3"
            android:text="Album Of Song"
            android:textSize="16sp" />

        <TextView
            android:id="@+id/artistOfSong"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:maxLines="3"
            android:text="Artist Of Song"
            android:textSize="18sp" />

        <TextView
            android:id="@+id/genreOfSong"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:maxLines="3"
            android:text="Genre Of Song"
            android:textSize="18sp" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/bottomLinear"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:orientation="horizontal" >
    </LinearLayout>

</RelativeLayout>

应用主题

<style name="AppBaseTheme" parent="Theme.AppCompat"></style>
<style name="AppTheme" parent="AppBaseTheme">
    <item name="android:windowDisablePreview">true</item>
    <item name="android:windowAnimationStyle">@null</item>
</style>

【问题讨论】:

  • 这真的没有意义,按钮栏不是正常屏幕的一部分,并且对齐父底部不受此影响。你确定你没有负的底部边距或类似的吗?或者播放器上方的容器可能会将其推出屏幕?
  • @breakline 这些天来,我面临着奇怪的问题。是的,我确定没有负边距或类似情况。我已经发布了我的 XML 文件。
  • 你尝试过 layout_gravity -> center 吗?顺便说一句,发布包含所有组件的完整 xml,更容易分析您的问题。
  • @Xplouder 我发布了完整的 XML 文件。重力中心?为什么我需要在底部显示它。
  • 您找到解决方案了吗?

标签: java android android-activity android-5.0-lollipop android-5.1.1-lollipop


【解决方案1】:

您的 Activity 似乎以某种方式使用了透明导航栏主题或类似的东西,允许在可见区域之外呈现视图。

也许提供一些有关您的 Activity 的背景信息将有助于弄清楚到底发生了什么。

话虽如此,您应该在 XML 布局的根目录中使用此属性 android:fitsSystemWindows 来强制视图仅在窗口的可见区域呈现。

【讨论】:

  • 我刚刚在有问题的 XML 中添加了context。我也尝试将android:fitsSystemWindows="true" 提供给根元素,但没有运气。
  • @gprathour 我说的不是tools:context,而是持有这个视图的Activity的风格/主题/配置(MyActivity)
  • 刚刚将应用主题添加到问题中。是你要求的吗?
  • 是的,但活动配置将是一个加号。您是否正在为 Activity 装饰视图设置可见性标志?或者做类似developer.android.com/training/system-ui/navigation.html 的事情?
  • 我刚刚添加了requestWindowFeature(Window.FEATURE_NO_TITLE);,除此之外别无其他。在哪里可以找到活动配置?
【解决方案2】:

如果您想保持其他所有内容相同并且只添加底部边距,this answer 描述了一种通过减去 getRealMetrics() 和 getMetrics() 并使用差异来获得底部软键栏高度的方法来暗示高度尺寸。

自己没有测试该方法,但反馈似乎是积极的。

【讨论】:

  • 嗯.. 谢谢。我已经经历了这样的选择,但想知道我们是否可以找出为什么会发生这样的事情以及解决这个问题的任何真正方法,而不仅仅是黑客攻击。
  • 抱歉,我错过了你说你已经硬编码边距的那一行。你能分享一下你正在使用的样式吗?在我看来,它的行为方式与操作栏的覆盖模式相同,就在底部。那里可能有一个线索。
【解决方案3】:

您可以像这样在布局中使用 defaultDisplay 高度和宽度: 对你来说,它是 RelativeLayout 参数。

    DisplayMetrics metrics = new DisplayMetrics();
    getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
    android.widget.FrameLayout.LayoutParams params = (android.widget.FrameLayout.LayoutParams) yourUI.getLayoutParams();
    params.width = metrics.widthPixels;
    params.height = metrics.heightPixels;
    params.leftMargin = 0;
    yourUI.setLayoutParams(params);

【讨论】:

    【解决方案4】:

    我通过编程设置布局高度等于显示高度解决了这个问题。

    Display display = getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    int height = size.y;
    int statusBarHeight = 0;
    int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0) {
          statusBarHeight = getResources().getDimensionPixelSize(resourceId);
    }
    RelativeLayout relativeLayout =(RelativeLayout)findViewById(R.id.relativeLayout);
    RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)relativeLayout.getLayoutParams();
    lp.height = height - statusBarHeight;
    relativeLayout.setLayoutParams(lp);
    

    【讨论】:

      【解决方案5】:

      嗨@gprathour 试试这个

      <LinearLayout
              android:id="@+id/bottomLinear"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:layout_alignParentBottom="true"
              android:layout_marginBottom="?attr/actionBarSize"
              android:orientation="horizontal" >
          </LinearLayout>
      

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-10
        • 2015-01-15
        • 2015-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多