键盘打开时,带有片段的活动不会调整大小

Posted

技术标签:

【中文标题】键盘打开时,带有片段的活动不会调整大小【英文标题】:Activity with fragments does not resize when the keyboard opens 【发布时间】:2014-10-07 19:46:01 【问题描述】:

在我的主要活动中,有一个 RelativeLayout 有 2 个孩子:

作为背景的ImageView 具有 2 个片段容器的 LinearLayout

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:layout_gravity="bottom"
    tools:context="$packageName.$activityClass">

    <ImageView
        android:layout_
        android:layout_
        android:adjustViewBounds="true"
        android:baselineAlignBottom="false"
        android:scaleType="fitStart"
        android:src="@drawable/bg_image" />

    <LinearLayout
        android:layout_
        android:layout_
        android:orientation="vertical"
        android:paddingTop="?android:attr/actionBarSize"
        android:layout_alignParentBottom="true">

        <LinearLayout
            android:id="@+id/ContainerA"
            android:layout_
            android:layout_
            android:layout_gravity="center"
            android:orientation="vertical" />
        
        <LinearLayout
            android:id="@+id/ContainerB"
            android:layout_
            android:layout_
            android:background="@color/background_gray"
            android:orientation="vertical" />

    </LinearLayout>
</RelativeLayout>

容器 A 只显示一个不会改变的片段。 但是,容器 B 包含一个片段,该片段会根据用户点击而发生变化。

容器 B 有两种变化:

它可以扩展(从大约 70% 的高度到全高)。 它会改变片段。

Container B 可以容纳的片段之一是一个表单,其中包含EditTexts 和其他视图。

我的问题是当键盘打开时我无法让活动调整大小。 我在清单文件中设置了adjustResize,我的主题不是全屏主题(这显然是导致此问题的原因)。我还尝试编辑视图,添加 ScrollViews 但绝对没有任何效果。

我用于此活动的主题是来自AppCompat 库的带有深色操作栏的浅色主题。我只编辑了主题以允许覆盖操作栏。这不是问题,因为我已经尝试删除这些编辑但无济于事。

Here's a link to the form layout

TL;DR adjustResize / adjustPan 不适合我。搜索,尝试了各种解决方案,没有任何效果。我的问题是;我的情况是什么原因造成的?

更新:AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" ...>

    <uses-sdk android:minSdkVersion="11" android:targetSdkVersion="19" />

    <application ... android:theme="@style/AppTheme">
        <activity android:name=".SplashScreenActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.Black.NoTitleBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".MainActivity"
            android:configChanges="keyboardHidden|screenSize" android:label="@string/app_name"
            android:screenOrientation="portrait" android:theme="@style/OverlayActionBarTheme"
            android:windowSoftInputMode="adjustResize"  />
        <activity android:name=".SettingsActivity"
            android:label="@string/title_activity_settings"
            android:parentActivityName=".MainActivity"
            android:windowSoftInputMode="adjustResize">
            <meta-data android:name="android.support.PARENT_ACTIVITY"
                android:value=".MainActivity" />
        </activity>
    </application>

</manifest>

更新 2: 我创建了一个全新的应用程序,添加了我的表单布局作为主布局,并测试了问题是否出在布局本身。事实证明,即使在这个新创建的应用程序上,它似乎也没有调整大小。

如上所述,可以找到布局的链接Here

更新 3: 通过用ScrollView 包围整个布局,我设法使它在新应用程序上工作。由于某种原因,我无法在原始应用中复制相同的效果......仍在试图找出原因。

【问题讨论】:

你能发一张图片是什么样子的吗 @xTCx,您是否尝试过 scrollviews主要活动片段 B 的 XML??? 请去除 LinearLayout 的复杂性(意味着您使用的是多层 LinearLayout )而不是您也可以使用 RelativeLayout 【参考方案1】:

当屏幕上出现软键盘时,应用程序 UI 的可用空间会减少。系统决定如何组织应用程序的 UI 和软键盘之间的可用空间。

如果窗口内容包含ListViewScrollView,则在所有内容可见的情况下调整应用程序窗口的大小。 如果调整大小不可行,则使用pan and scan 方法,该方法只需滚动应用程序的窗口,以使当前聚焦的视图可见。

由于您的布局不包含任何ListViewScrollView,因此排除了重新调整大小的可能性。

窗口的根视图是一个FrameLayout,您最初将LinearLayout 添加到该视图中。由于LinearLayout 不支持滚动,pan and scan 的做法也被排除在外。因此,将布局包裹在 ScrollView 中解决了滚动问题。

您可以参考Android Developers blog了解更多详情。

更新 1:

OP 能够解决这个问题,如answer 中所示。问题的发生是由于一个片段在动画之后覆盖了另一个片段,而这些Fragment 的父级是LinearLayout。为了覆盖目的,您只需要使用RelativeLayoutFrameLayout

【讨论】:

您好,感谢您的评论。这实际上非常接近真正的“解决方案”,请阅读下面的答案并编辑您的答案,以便我将其标记为已接受! :)【参考方案2】:

您也可以在 Fragment 中使用此代码

此代码为调整视图大小提供帮助

public static class MyDialog extends DialogFragment 

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 

    // Dialog layout inflater code
    // getDialog() need to be called only after onCreateDialog(), which is invoked between onCreate() and onCreateView(). 
      getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN |     WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
   // return view code
  

【讨论】:

这是我 Fragment 中唯一对我有用的,谢谢! 为我在 Viewpager 中的片段工作。【参考方案3】:

在“AndroidManifest.xml”中将以下语句中的模式更改为“resize”。

 <activity android:name=".ActivityName"
        android:windowSoftInputMode="adjustResize">

并请删除 LinearLayout 的复杂性(意味着您正在使用多级 LinearLayout),而不是您也可以使用 RelativeLayout .. 使用它您可以轻松设置 Layout .. 尝试一下也希望您的问题可能整流器

我希望这会有所帮助。

【讨论】:

【参考方案4】:

在 BottomSheetFragment / Dailogfragment 的 onCreateDialog 中使用它

KeyboardUtil(getActivity(), view);

片段使用

new KeyboardUtil(this, findViewById(R.id.fragment_container));

通过使用这个 Util 类

https://github.com/mikepenz/MaterialDrawer/blob/aa9136fb4f5b3a80460fe5f47213985026d20c88/library/src/main/java/com/mikepenz/materialdrawer/util/KeyboardUtil.java

图片来源:迈克彭斯

【讨论】:

没有任何帮助,但最后这个帮助很大 这应该是公认的答案!这是唯一有效的方法! 可以滚动内容但不会自动跳转【参考方案5】:

在清单文件中使用此行来处理您想要结果的活动 希望对你有帮助

   android:windowSoftInputMode="adjustPan|stateAlwaysHidden" 

喜欢

  <activity
            android:name="com.android.youractivity"
            android:windowSoftInputMode="adjustPan|stateAlwaysHidden" />

【讨论】:

谢谢。不幸的是,我之前已经尝试过,但没有成功。【参考方案6】:

原来我的问题是由一个完全意想不到的来源引起的。

发生的事情是我使用了LinearLayout 作为我的两个片段容器的父级。 然后,在我展开的动画中,我将底部容器抬起以与另一个容器重叠。

我真的不知道为什么,但由于LinearLayout 不应该包含重叠的孩子,切换到RelativeLayoutFrameLayout 立即解决了这个问题。

由于这个原因可能从我发布的代码中看不出来,我确实想为缺乏信息而道歉,并将最详细的答案视为最佳答案。

【讨论】:

【参考方案7】:

在R.layout.layout_ui下面的DialogFragment Oncreateview中添加这行代码

getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN |     WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

【讨论】:

以上是关于键盘打开时,带有片段的活动不会调整大小的主要内容,如果未能解决你的问题,请参考以下文章

防止背景调整大小并防止自动关注活动开始

打开手机键盘(JS)时防止调整大小事件

vim打开时窗口大小怎么调整,在_vimrc中怎么设置?

重新打开时 JQuery UI 对话框没有正确调整大小?

键盘打开时布局不调整

我的布局键盘上的空格按钮大小不会调整大小