防止键盘打开时的特定布局移动

时间:2017-05-23 11:03:04

标签: android android-layout

我有下一个问题。

我的布局结构是:

<RelativeLayout>
   <AppBarLayout>
      <Toolbar></Toolbar>
   </AppBarLayout>
   <FrameLayout> Here I load fragments  </FrameLayout>
   <Footer></Footer>
</RelativeLayout>

我想使用功能:

android:windowSoftInputMode="adjustResize"

在我的活动中,但问题是页脚在键盘上打开了。我不知道如何防止只有页脚移动,但所有其他观点都是。我正在寻找解决方案的日子,但没有成功。

当我设置:

android:windowSoftInputMode="adjustPan"

页脚没有移动哪个好,但是带有EditText的表单被键盘覆盖,这是令人烦恼和糟糕的UI / UX。

我的页脚有

android:layout_alignParentBottom="true"

以下是完整的XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/activity_logged_in"
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.design.widget.AppBarLayout
    android:id="@+id/main_app_bar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <android.support.v7.widget.Toolbar
        android:id="@+id/main_app_toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light">


    </android.support.v7.widget.Toolbar>

</android.support.design.widget.AppBarLayout>


<LinearLayout
    android:id="@+id/bottom_navigation"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:layout_alignParentBottom="true"
    android:layout_alignParentEnd="true"
    android:layout_alignParentStart="true"
    android:orientation="horizontal"
    android:paddingBottom="5dp"
    android:paddingTop="5dp">

    <!-- Footer goes here -->

</LinearLayout>


<FrameLayout
    android:id="@+id/fragment_logged_in_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_above="@id/bottom_navigation"
    android:layout_below="@id/main_app_bar" />

</RelativeLayout>

提前致谢

2 个答案:

答案 0 :(得分:0)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/main_app_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.v7.widget.Toolbar
            android:id="@+id/main_app_toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light">


        </android.support.v7.widget.Toolbar>

    </android.support.design.widget.AppBarLayout>

    <FrameLayout
        android:id="@+id/fragment_logged_in_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1">

        </FrameLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">


    </LinearLayout>


</LinearLayout>

这对我有用。

答案 1 :(得分:0)

首先,使用<RelativeLayout>作为布局根。

现在,您可以通过两种方式堆叠内容:

  1. 从上面
  2. 从下面
  3. 假设您有五条内容A - E.当您的应用程序窗口从底部调整大小时,您只希望E向上移动(即:键盘从下方显示)。所以你想要做的是,从上面开始堆叠A - D,并从下面堆叠E.

    这是一个例子。为简洁起见,遗漏了不必要的属性。

    <RelativeLayout
        android:layout_width="match_parent" 
        android:layout_height="match_parent">
    
    <AnyView
        android:id="@+id/A"
        android:layout_alignParentTop="true"/>
    
    <AnyView
        android:id="@+id/B"
        android:layout_below="@+id/A"/>
    
    <AnyView
        android:id="@+id/C"
        android:layout_below="@+id/B"/>
    
    <AnyView
        android:id="@+id/D"
        android:layout_below="@+id/C"
        android:layout_above="@+id/E"/> <!-- this one will fill any space left out after adding views A, B, C, and E -->
    
    <AnyView
        android:id="@+id/E"
        android:layout_alignParentBottom="true"/>
    
    
    </Relativelayout>
    

    所以基本上发生的事情是,当键盘显示时,屏幕的底部锚点向上移动。当您说android:layout_alignParentBottom="true"时,这会将该视图保持在此底部锚点之上。

    但就其他观点(A,B,C和D)而言,它们并不直接依赖于底部锚点。所以,他们不会移动或调整自己。

    要记住一件事。当您构建这样的布局(从顶部稍微堆叠,从底部稍微堆叠)时,将始终存在一个具有可变高度的特定视图,并将根据不断变化的屏幕高度进行调整。在上面的示例中,该视图为D