Android 软键按钮隐藏视图的内容

Android Soft-Key-Buttons hide view's content

我遇到了 Android 上带有软键按钮的设备布局太大的问题:

总结一下,我的问题是为什么配置为 "match_parent" 的布局扩展了视图边界到 "real" 底部 window 边界,而不是刚好在软键按钮上方?

现在解决我的具体问题:

同时显示带有视图的 RelativeLayout(在 Fragment 中,如果有必要知道的话)layout_alignParentBottom="true" 在任何带有软键按钮的设备上,视图显示 "behind" 软键按钮。

Image of the View on a Device without Soft-Key-Buttons (as it should be)

Image of the View on a Device with Soft-Key-Buttons (the Button is "hiding" behind the Soft-Keys)

RelativeLayout 如下所示:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:custom="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/bg2">

    <LinearLayout
        android:layout_marginTop="@dimen/settings_container_margin_top"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:orientation="vertical">

        <!-- Some views -->

    </LinearLayout>

    <at.eventdrivers.android.ui.MenuButton
        android:layout_width="250dp"
        android:layout_height="50dp"
        android:layout_gravity="center_horizontal"
        android:layout_centerHorizontal="true"
        android:layout_alignParentBottom="true"
        custom:btnText="@string/..." />

</RelativeLayout>

由于我是 Android 开发的新手,之前也没有使用 Fragments 做过任何事情,错误也可能出在片段管理中,所以我要 post这也是:

显示片段的Activity配置在AndroidManifest:

<activity
    android:name=".slidingmenu.SlidingHomeActivity"
    android:label="@string/app_name"
    android:logo="@mipmap/ic_launcher"
    android:theme="@style/AppBaseTheme"
    android:windowSoftInputMode="adjustResize"
    android:screenOrientation="portrait" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

使用的FrameLayouts都将layout_width和layout_height设置为match_parent。

现在我正在使用一种解决方法,以编程方式检查设备是否显示软键按钮,如果是,则将此按钮的边距设置为更高的值:

public static boolean hasSoftKeys(Context c) {
    if(Build.VERSION.SDK_INT <= 10 || (Build.VERSION.SDK_INT >= 14 &&
            ViewConfiguration.get(c).hasPermanentMenuKey())) {
        //menu key is present
        return false;
    } else {
        //No menu key
        return true;
    }
}

问题是软键按钮在不同设备上有不同的高度,所以我也必须检查软键按钮的高度(这是可能的并且已经在 Whosebug 上回答了).

我被这个问题困了几个星期了,非常感谢任何帮助。

我可以想象三种不同的场景:

  1. (不太可能)你用 LayoutParams Flags of your Window(like getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);)and/or Theme's styles

  2. (不太可能。虽然这是我的首字母,但 layout_alignParentBottom="true" 应该会为您处理)屏幕上的 space 不够。你能把你的 RelativeLayout 包装成 ScrollView(这需要你将 RelativeLayout 的高度更改为 wrap_content)并查看结果吗? (如果您将 match_parent 设置为 RelativeLayout 并不意味着它将所有内容都适合屏幕尺寸。内容很容易从屏幕上消失,就像您提供的屏幕截图一样。但是同样, layout_alignParentBottom="true" 处理它。

  3. (最有可能)您在 Activity 中有一些 margins/paddings(尤其是 android:layout_marginBottom="-XXdp" 之类的东西),它托管 Fragment。所以片段渲染正确,但 Activity 将其移动到屏幕下方。

更准确地说,这里有 @style/AppBaseTheme 会很好,Activity 的布局,如果您对 getWindow() 做了一些可疑的事情 - 这段代码。

如果有帮助,请告诉我!

这个对我有用,只需将它添加到您的 v21/styles。xml

<item name="android:windowDrawsSystemBarBackgrounds">false</item>