Furudateのブログ

プログラミングやネットワーク系の知識・技術がメインのブログ。技術メモ帳的な感じになるかと。岩手から発信していきます。

【Android】キーボードが出現したら画面をスクロールする

こんばんは。

Androidで、テキストフォームとかに入力しようとすると、キーボードが出てしまい、下にあるボタンなどが隠れてしまう場合があります。

そんなときはキーボードが出ている状態で画面をスクロールできると良いですよね。

そこで、それを実装したいと思います。
色々ググると、AndroidManifestの対象Activityタグの中に「android:windowSoftInputMode="adjustPan"」を指定すると出来ると書いてあります。

しかし、なぜか自分は出来ず・・・
なんで出来ないのかは未だに不明です。

そこで結構ハマッてしまったのですが、やっと解決方法を見つけました。
まずレイアウトファイルで、全体をスクロールビューに入れます。
こんな感じです。

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true"
    android:layout_weight="1">
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    tools:context=".MainActivity" >

    <EditText />
    .
    .
    .
</RelativeLayout>
</ScrollView>

重要なのは、ScrollViewで android:layout_weight="1" としていることです。

そして、次にManifestの対象Activityタグの中に以下を記述します。

android:windowSoftInputMode="adjustResize"

adjustResize は、android:layout_weight="1"のものをリサイズするようです。
これでスクロールが出来るようになると思います。

すごく悩んでいたのですが、とりあえずこれで出来たので良しとします。

以上です。
それでは。

2013/11/21 追記

どうしてもScrollViewを入れられない(ScrollViewが入れ子になってしまうような)レイアウトファイルで同じような状況が発生してしまいました。
この場合は、上記の"adjustResize"を使えないので困っていた所、"adjustPan"をAndroidManifestの対象Activityに指定したら意図していた動作をしてくれました。

ただし、この場合はスクロールできるようになるのではなく、フォーカスがあたっているEditText等を基準に、キーボードの上にView全体をスクロールしてくれるというものですが。

なぜ前の環境で動かなかったのかは不明ですが、ScrollViewを入れられない場合は、"adjustPan"で対応していくのが良さそうです。