键盘打开时,带有片段的活动不会调整大小
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 可以容纳的片段之一是一个表单,其中包含EditText
s 和其他视图。
我的问题是当键盘打开时我无法让活动调整大小。
我在清单文件中设置了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 和软键盘之间的可用空间。
如果窗口内容包含ListView
、ScrollView
,则在所有内容可见的情况下调整应用程序窗口的大小。
如果调整大小不可行,则使用pan and scan
方法,该方法只需滚动应用程序的窗口,以使当前聚焦的视图可见。
由于您的布局不包含任何ListView
、ScrollView
,因此排除了重新调整大小的可能性。
窗口的根视图是一个FrameLayout
,您最初将LinearLayout
添加到该视图中。由于LinearLayout
不支持滚动,pan and scan
的做法也被排除在外。因此,将布局包裹在 ScrollView 中解决了滚动问题。
您可以参考Android Developers blog了解更多详情。
更新 1:
OP 能够解决这个问题,如answer 中所示。问题的发生是由于一个片段在动画之后覆盖了另一个片段,而这些Fragment
的父级是LinearLayout
。为了覆盖目的,您只需要使用RelativeLayout
或FrameLayout
。
【讨论】:
您好,感谢您的评论。这实际上非常接近真正的“解决方案”,请阅读下面的答案并编辑您的答案,以便我将其标记为已接受! :)【参考方案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
不应该包含重叠的孩子,切换到RelativeLayout
或FrameLayout
立即解决了这个问题。
由于这个原因可能从我发布的代码中看不出来,我确实想为缺乏信息而道歉,并将最详细的答案视为最佳答案。
【讨论】:
【参考方案7】:在R.layout.layout_ui下面的DialogFragment Oncreateview中添加这行代码
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN | WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
【讨论】:
以上是关于键盘打开时,带有片段的活动不会调整大小的主要内容,如果未能解决你的问题,请参考以下文章