【问题标题】:Android soft keyboard hides split barAndroid软键盘隐藏分割栏
【发布时间】:2012-10-28 17:16:11
【问题描述】:

我有一个在运行时加载片段的活动。当我启动应用程序时,活动会加载一个带有 EditText 的片段。我将 ActionBarSherlock 与 splitActionBarWhenNarrow 一起使用,所以我有一个拆分栏(屏幕底部的操作栏)。当 EditText 获得焦点并加载软键盘时,它会位于拆分栏的顶部,将其隐藏。在操作栏上,我还使用 NAVIGATION_MODE_LIST 并使用下拉菜单加载另一个片段。当我加载另一个片段时,下部操作栏正确显示在软键盘顶部,即使我转到另一个片段,它仍然可以正常工作。我将添加一些屏幕截图以清除它:

第一个片段加载器,使用软键盘看不到拆分栏

使用操作栏导航加载第二个片段后

重新加载另一个片段,操作栏仍然可见

我尝试使用最少代码的测试项目来加载片段,并且行为是相同的,分割栏被软键盘隐藏。 如何让它从头开始显示拆分栏?

编辑:android:windowSoftInputMode="adjustResize" 不会改变此行为的任何内容

活动布局:

<it.bem.remailr.MyFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:orientation="horizontal"
android:background="@drawable/bg_no_repeat"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />

片段布局:

<it.bem.remailr.MyRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >

<EditText
    android:id="@+id/editText1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="top|left"
    android:inputType="textMultiLine|textNoSuggestions"
    android:windowSoftInputMode="adjustPan"
    android:background="#00000000"
    android:hint="@string/text_hint"
    android:scrollHorizontally="false" >
</EditText>

<ProgressBar
    android:id="@+id/progressBar1"
    style="?android:attr/progressBarStyle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true" />

【问题讨论】:

  • 您确定这不仅仅是拼写建议隐藏了拆分操作栏吗?
  • 我在看截图时是这么想的,但是在我加载第二个片段并返回编辑片段后,如果我单击 EditText 会出现拼写建议而不隐藏拆分栏。在不相关的说明中,感谢您的预订!

标签: android android-layout


【解决方案1】:

您是否尝试在显示输入法之后立即向主线程发布布局请求?您可以通过覆盖根View 中的onSizeChanged() 回调来确定是否显示/隐藏输入法。作为一个肮脏的概念证明,您可以在给定的持续时间后发布该布局请求(确保您事先显示输入法)。

您还可以使用ViewServer 在您的设备上运行hierarchyviewer,而不是在模拟器上,以确定存在哪些Views(也就是说,如果候选人覆盖拆分操作栏)。据我记得,候选视图被添加到包含KeyboardView 的根Dialog 中,因此拆分操作栏很可能就在空格键下方,而不是在候选视图下方。

为了实现onSizeChanged(),您必须扩展位于View 层次结构根目录的ViewGroup 类。例如,您可能有一个LinearLayout 作为您的根ViewGroup,并且您所有的Views 都是它的子级。然后你要做的是创建一个名为MyLinearLayout 的新类,它扩展LinearLayout,将MyLinearLayout 作为你的根View 在xml 文件中,然后实现onSizeChanged() 回调。然后在显示输入法时被系统调用。

【讨论】:

  • 我试过hierarchyviewer,但我看不到上面的键盘。从 hierarchyviewer 发出 requestLayout 不会改变任何东西。如何在根视图上覆盖 onSizeChanged()?根视图不是片段布局吗?我想我在这里犯了一些愚蠢的错误,否则其他人应该已经注意到了。
  • 我已经更新了与 onSizeChange() 查询相关的答案。当你说你尝试过hierarchyviewer时,这是在模拟器中吗?
  • 谢谢。我在 onSizeChanged() 中放置了一个记录器以查看它何时被调用:当我启动应用程序并单击 EditText 时,会显示键盘并且不会调用 onSizeChanged()。如果我像屏幕截图中那样完成导航过程,那么每次显示键盘时,都会调用 onSizeChanged()。这发生在我的手机和模拟器上。对于hierarchyviewer,我使用了电话。
  • 快速尝试:android:windowSoftInputMode="adjustPan" 应该在 Activity 上设置,而不是在给定的 View 上。尝试将该行移至 Manifest(请参阅 developer.android.com/guide/topics/manifest/…
  • 编辑:它是adjustResize,在活动上,它可以工作。谢谢!
猜你喜欢
  • 2016-02-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-14
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-17
相关资源
最近更新 更多