EditText 显示状态栏,或导致上面的内容移动而不是调整大小
Posted
技术标签:
【中文标题】EditText 显示状态栏,或导致上面的内容移动而不是调整大小【英文标题】:EditText shows the status bar, or causes content above to move instead of resize 【发布时间】:2015-09-09 00:51:09 【问题描述】:背景
我有一个登录 Activity ,它有这样的布局(垂直,从上到下):
-
标题(徽标 ImageView 和 TextView)
占据屏幕其余部分的图像和视图页面
EditTexts&login 按钮,出现在 #2 的顶部(覆盖其中的一部分),但在屏幕底部
我需要让这个活动全屏,隐藏状态栏,当软键盘出现时,稍微改变一下布局,如上 #3 所示。
问题
这些要求的组合似乎很成问题。
我有两个主要问题:
我为感应显示的软键盘所做的工作 - 在这里似乎不起作用,即使它在其他活动上运行良好。
当软键盘出现时,它要么重新显示状态栏,要么将内容移动到底部区域上方(#3)而不是调整它的大小,同时隐藏底部的按钮(的#3) 并且仅将 EditText 显示为软键盘上方的第一个视图。
由于无法真正监听软键盘何时显示/隐藏,因此我必须创建一个自定义布局,它只会告诉我它的大小何时发生变化。当它的高度降低时,我假设显示键盘,反之亦然。
我尝试过的
我尝试了多种布局变体。似乎没有帮助 我使用这个布局作为片段的根,检查是否显示了软键盘(因为它改变了它的大小): https://***.com/a/25895869/878126 遗憾的是,它适用于除此之外的所有其他活动。 我尝试了各种“windowSoftInputMode”值,包括“adjustResize”和“adjustPan” 我认为问题是因为我使用了透明导航栏,所以我禁用了它,还禁用了底部区域的“fitsSystemWindows”(#3)。我试过这样隐藏状态栏:
requestWindowFeature(Window.FEATURE_NO_TITLE);
也是这样:
if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN)
View decorView = getWindow().getDecorView();
int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);
else
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
当前布局
这是对当前布局的简短描述:
<LayoutSizeChangedSensorFrameLayout>
<RelativeLayout>
#1
<LinearLayout vertical, aligned to parent-top>
<ImageView/>
<TextView/>
<CirclePageIndicator/>
</LinearLayout>
#2
<ImageView aligned to parent-bottom, and below #1 />
<ViewPager aligned to the ImageView from all sides/>
#3
<LinearLayout vertical, aligned to the parent-bottom>
<TextView/>
<EditText/>
<Button/>
</LinearLayout>
</RelativeLayout>
</LayoutSizeChangedSensorFrameLayout>
这就是活动的主题:
<style name="AppTheme.Material" parent="@style/Theme.AppCompat.Light.DarkActionBar">
...
<item name="windowActionBar">false</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:windowTranslucentNavigation" tools:ignore="NewApi">true</item>
<item name="android:windowTranslucentStatus" tools:ignore="NewApi">true</item>
<item name="android:navigationBarColor" tools:ignore="NewApi">@android:color/transparent</item>
</style>
问题
为什么隐藏状态栏不能永久起作用,或者它会影响显示软键盘时显示的内容?
我的自定义布局怎么感觉不到软键盘显示?
还有其他方法可以实现我所尝试的吗?
【问题讨论】:
有没有运气解决这个问题? 我们的解决方案是过渡到顶部有“编辑文本”的内容。 【参考方案1】:通过执行以下 2 个步骤,我设法在软键盘显示时隐藏状态栏:
在activity的onCreate中添加如下:
//No title bar is set for the activity
requestWindowFeature(Window.FEATURE_NO_TITLE);
//Full screen is set for the Window
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
在主题中设置windowFullscreen
到true
:
<style name="CustomTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowFullscreen">true</item>
</style>
很遗憾,这不是一个完整的答案,但它可能会帮助您解决一些问题。
【讨论】:
主要问题是 EditText 下方的登录按钮可能会因为其上方的键盘而被隐藏。你能举一个完整的例子吗? 非常感谢!!这是始终隐藏状态栏的终极方法:除了将 FLAG_FULLSCREEN 添加到窗口之外, FLAG_FORCE_NOT_FULLSCREEN - 这个标志也可以被清除:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
【讨论】:
以上是关于EditText 显示状态栏,或导致上面的内容移动而不是调整大小的主要内容,如果未能解决你的问题,请参考以下文章
今天遇到的问题,解决UITableView页面上面的内容先被导航栏覆盖,然后再向下移动的问题 ( 懒加载有时候并不好! )