弹出软键盘时页面滚动


99

我有一个<ScrollView>布局:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/my_scrollview"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <EditText
            android:id="@+id/input_one"
            android:layout_width="300dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:inputType="number" >

         <EditText
            android:id="@+id/input_two"
            android:layout_width="300dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:inputType="number" >

         <EditText
            android:id="@+id/input_three"
            android:layout_width="300dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:inputType="number" >

          <Button
            android:id="@+id/ok_btn"
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginTop="20dp"
            android:text="@string/ok_str" />

      </LinearLayout>
</ScrollView>

如上所示,简单的布局包括三个输入字段和一个“确定”按钮。

我以上述布局运行我的应用程序,当我点击第一个输入字段(@+id/input_one)时,软键盘将从屏幕底部弹出,它隐藏了第三个输入字段和“确定”按钮。

自从我使用以来<ScrollView>,我想可以向上滚动页面以查看软键盘隐藏的第三个输入字段和“确定”按钮,但是该页面不可滚动。为什么?如何摆脱它?基本上,我希望看到每个输入字段和“确定”按钮,甚至弹出的软键盘也是如此。


1
删除<ScrollView>,LinearLayout应该是您的外部布局,它将起作用,我希望即使sofkeyboard弹出。
Abid A. Chaudhary '04年

1
@pakshaheen当需要scrollview时,这不能解决问题。
Luten

Answers:


125

我通过定义以下属性固定的问题<activity>的AndroidManifest.xml

android:windowSoftInputMode="adjustResize"

12
您不需要stateVisible。这将使软键盘在启动应用程序时出现,即使用户没有专注于EditText
RajV,

它是自动打开的键盘,即使没有edittext
X先生

37

好的,我已经搜索了几个小时才能找到问题,然后找到了。

这些变化都没有喜欢fillViewport="true"android:windowSoftInputMode="adjustResize"帮助过我。

我使用Android 4.4,这是个大错误

android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"

以某种方式,当看到SoftKeyboard时,全屏主题会阻止ScrollViews滚动。

此刻,我最终使用了它:

android:theme="@android:style/Theme.Black.NoTitleBar

我不知道如何摆脱时间和电池显示的顶部系统栏,但至少我遇到了问题。

希望这对其他有相同问题的人有所帮助。

编辑:我为我的情况有一些解决方法,所以我在这里发布

我不确定这是否对您有用,但肯定会帮助您理解并清除一些问题。

EDIT2: 是另一个很好的主题,它将帮助您朝正确的方向前进甚至解决您的问题。


+1在我的情况下,状态栏被代码中的第三方库隐藏: getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
de。

@qweret如果我两个都需要怎么办?全屏和滚动。
Prabs

@Prabs您找到任何解决方案了吗?我也想要全屏和滚动。
约翰尼(Johny)

@Johny Nope。目前,我使用全屏显示整个应用程序,但带有scrolling3的活动除外。
Prabs '17

@Prabs我认为唯一的解决方案是具有透明的状态栏,但对我而言仍然是一个问题,因为我想支持API> = 16。你有什么主意吗?
约翰尼(Johny)

20

对我来说,唯一有效的方法是将此属性放入清单中的活动中:

android:windowSoftInputMode="stateHidden|adjustPan"

打开活动时不显示键盘,并且不要与视图底部重叠。


14

在无全屏模式下将其放入清单中

android:windowSoftInputMode="stateVisible|adjustPan" 

在你的清单上

<activity
    android:windowSoftInputMode="stateVisible|adjustPan"
    android:name="com.example.patronusgps.MainActivity"
    android:label="@string/app_name" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

1
我已经尝试过了,但是毫不留情,根本没有运气...但是,根视图不是 a ScrollView,而是a RelativeLayout,其中包含a LinearLayout,然后包含aScrollView
James Heald,2017年


8

看看这个。

<activity android:name=".Calculator"
    android:windowSoftInputMode="stateHidden|adjustResize" 
    android:theme="@android:style/Theme.Black.NoTitleBar">
</activity>

3

这仅对我有用:

android:windowSoftInputMode="adjustPan"

2

另外,如果您要以编程方式执行此操作,只需将以下行添加到活动的onCreate中。

getWindow().setSoftInputMode(
            WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | 
            WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE );

1

您可以尝试使用以下代码来解决您的问题:

 <activity
     android:name=".DonateNow"
     android:label="@string/title_activity_donate_now"
     android:screenOrientation="portrait"
     android:theme="@style/AppTheme"
     android:windowSoftInputMode="stateVisible|adjustPan">
 </activity>

17
您应该费心解释代码的用途,而不仅仅是发布简单的代码作为答案。
Angel Politis

0

好吧,我尝试过的最简单的答案是删除您的代码以使活动进入全屏状态。我有一个类似的代码负责使活动进入全屏状态:

如果(Build.VERSION.SDK_INT> = Build.VERSION_CODES.KITKAT){

        getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
    }

我只是删除了我的代码,但它完全可以正常工作,但是如果您要在全屏模式下实现此目的,则必须尝试其他方法

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.