web-dev-qa-db-ja.com

ソフトウェアキーボードが表示されたときに背景画像のサイズを維持する方法

ソフトウェアキーボードが表示されると、レイアウトのサイズが変更され、背景画像が一緒に圧縮されます。私の質問は基本的にこの質問の複製であり、非常に良い方法で説明されています。

ソフトウェアキーボードはAndroidの背景画像のサイズを変更します

しかし、彼らがそれを解決するためのハックを見つけたとき、その質問は閉じられました。このハックは使えません。私のレイアウト全体はScrollView内にあり、このスクロールビューを常に適切に使用できる必要があります。 Android:windowSoftInputMode = "stateVisible | AdjustPan"を使用すると、レイアウトがキーボードの背後に部分的に存在するため、キーボードが表示されている間、ユーザーは下にスクロールして画面の下部を表示できなくなります。したがって、解決策は私には受け入れられません。そこにもっと良い解決策はありますか?

乾杯、

22
pgsandstrom

何日にもわたるハードコアハッキングの後、私はついに解決策を構築することができたので、実際にそれを読むのは痛いかもしれません。スクロールビューの後ろに背景のあるImageViewを配置し、キーボードが表示されたときに縮小しないようにscaleType = "matrix"を設定します。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:background="@color/black"
    >
    <ImageView
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent"
        Android:src="@drawable/mah_kewl_background"
        Android:scaleType="matrix"
        />
    <ScrollView
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent"
        Android:fillViewport="true"
        >
        <RelativeLayout
            Android:id="@+id/smsLayout"
            Android:layout_width="fill_parent"
            Android:layout_height="fill_parent"
            >
            <TextView
                Android:layout_width="fill_parent"
                Android:layout_height="wrap_content"
                Android:text="PLUNX"
                />
        </RelativeLayout>
    </ScrollView>
</RelativeLayout>
28
pgsandstrom

私は実際、それほど前に同様の問題に遭遇しました。しかし、私は少しの作業で正解に出くわしました。

使用している特定のアクティビティに添付されている、このプロジェクトのAndroidマニフェスト)で、アクティビティタグの行Android:windowSoftInputMode="adjustPan|stateVisible"を使用します。

adjustPanは基本的に、アクティビティがソフトキーボードに合わせてサイズ変更されないことを意味し、stateVisibleは、要求されたときにソフトキーボードが表示されることを意味します(必要に応じてstateAlwaysVisibleなど)。

ソース: Android Dev for Activityタグ

32
syklon

WindowBackgroundプロパティを使用して、ドローアブルを画面全体に合わせることができます。これを行うには、次のことを行う必要があります。

1-スタイルを作成します。

<style name="Background" parent="@Android:style/Theme.NoTitleBar">
    <item name="Android:windowBackground">@drawable/you_bg_drawable</item>
</style>

2-AndroidManifest.xmlでアクティビティスタイルを設定します

<activity
    Android:name=".ui.your_activity"
    Android:theme="@style/Background"/>
22
aglour

これに出くわしたとき、私はこの正確な問題の解決策を探していました。いくつかの調査を行った後、私は少し良いと思う解決策を見つけました。 ImageViewでハッキングする代わりに、アクティビティからこれを使用できます。

      getWindow().setBackgroundDrawableResource(R.drawable.bg_my_background);

それがこれに対する解決策を探している他の誰かに役立つことを願っています。

8
John Nilsen

たぶん、別の(本当に簡単な!)解決策があります:styles.xmlで:次のような新しいスタイルを作成します:

<style name="Yourstyle" parent="AppBaseTheme">
    <item name="Android:windowBackground">@drawable/mybackground</item>
</style>

AppBaseThemeは、アプリで通常使用されるテーマです。次に、Manifest.xmlを追加します。

<activity 
    Android:name="com.your.app.name.Activity"
    Android:theme="@style/Yourstyle">
</activity>

つまり、同じスタイルですが、背景があります。

重要:通常の.xmlファイルに背景を設定しないでください!

これは私の最初の投稿であり、それが私の英語に役立つことを願っています。

7
stefan96

あなたの答えについてコメントすることはできませんが、何か追加したいと思います。

私はあなたのジレンマと、あなたがリンクした解決策があなたの状況に対する完全な解決策ではない理由を理解しています(ビューの一番下までスクロールできないため)。大きなスクロール可能なEditTextボックスでも同様の状況が発生します。ソフトキーボードがポップアップするとき、背景がつぶれるのは好きではありません。

私はあなたの解決策を試しました、そしてそれは一見うまくいくように見えますが、それが理想的でないかもしれないいくつかの状況があります:

  1. アプリに横向きモードを許可すると、背景のサイズ変更/ストレッチは行われません
  2. より大きな画面またはdpiのデバイスでアプリを実行すると、背景が画面全体に表示されない場合があります

基本的に、scaleTypematrixに設定すると、Androidは、縮尺ではなく1:1で背景を描画するように指示しているようです。では、何が起こっているのでしょうか。ソリューションisを使用してソフトキーボードを開くと、scrollViewimageViewはすべて通常どおりサイズ変更されますが、設定した画像srcは1:1のままなので、同じ領域が引き続き表示されます。

たとえば、背景画像が特定のサイズ(480 x 800など)に設定されていて、Nexus Oneを完全に埋めている場合、横向きに回転すると、右側に黒い領域が表示されます。

もちろん、背景が単に繰り返しパターンである場合、これは議論の余地があります。その場合、背景を非常に大きくして、さまざまな画面(おそらくタブレット)を補正することができます。

または、画面サイズ/密度/向きごとに異なる背景を指定することもできますが、これでもスケーリングは考慮されません。

これを解決しようとする無駄な努力の中で、私は Android:isScrollContainer というView属性に出くわしました。この属性は、特定のビューに、ソフトキーボードの表示時にサイズ変更を許可するかどうかを指示します。これは、リンクされたソリューションの誰かによっても言及されています。背景を含むViewGroupでこれを(falseに)設定しようとしましたが、スクロールする子要素がそれをオーバーライドしているようで、再び押しつぶされます。

今のところ、私たちの状況に対する完全な解決策はないと思います。あなたのは確かにいくつかの例で動作します、そして私は努力に感謝します。グーグルが将来的に解決策を提供することを願っていますが、彼らがこれを問題/優先事項と見なすことはないと思います。

7
Tony Chan

androidmanifestのアクティビティタグの使用:

<activity ... Android:windowSoftInputMode="adjustPan" ></activity>

チェック Android開発者リファレンス

6
xhandros

「背景」がレイアウトであるソリューションはどうですか。レイアウトを膨らませてウィンドウ全体のサイズにしてから、ウィンドウの背景として挿入できますか?

1
James Barwick

たくさんの時間を検索した後...

各アクティビティにAndroid:windowSoftInputMode="adjustPan|stateVisible"を入れます

0
Erick Alves