2011-09-04 7 views
37

ソフトキーボードが表示されている場合、レイアウトによっては一部のアプリケーションでレイアウトが変化することがあります。レイアウト全体(おそらく内部レイアウト)が現在のEditTextだけでなく、シフトするため、これは確かにadjustPanではありません。これは、例えばEvernoteのログイン画面にあります。これはどうやって助言できますか?ソフトキーボードがオンのときのレイアウトを調整

+0

キーボードが表示されたとき、あなたのレイアウトがシフトアップあなたの問題ですか? –

+1

質問はそのようにする方法です。 – Eugene

+0

あなたのレイアウトがプルアップしないようにしたいのではないでしょうか? –

答えて

66

ここでEvernoteのログイン画面のように機能するソリューションです:

まず、このようなあなたの特別のLinearLayoutになりますクラスを定義します。

public class MyLayout extends LinearLayout { 

public MyLayout(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public MyLayout(Context context) { 
    super(context); 
} 

private OnSoftKeyboardListener onSoftKeyboardListener; 

@Override 
protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) { 
    if (onSoftKeyboardListener != null) { 
     final int newSpec = MeasureSpec.getSize(heightMeasureSpec); 
     final int oldSpec = getMeasuredHeight(); 
     if (oldSpec > newSpec){ 
      onSoftKeyboardListener.onShown(); 
     } else { 
      onSoftKeyboardListener.onHidden(); 
     } 
    } 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
} 

public final void setOnSoftKeyboardListener(final OnSoftKeyboardListener listener) { 
    this.onSoftKeyboardListener = listener; 
} 

public interface OnSoftKeyboardListener { 
    public void onShown(); 
    public void onHidden(); 
} 

} 

このレイアウトは変化を測定するために聞き、新しい場合測定値は古いものよりも<です。つまり、画面の一部がソフトキーボードで食べられます。

マニフェストで動作させるには、android:windowSoftInputMode="adjustResize"を設定する必要がありますが、コンテンツのサイズが変更され、シフトされるだけではありません。

、システム全体は以下のように動作します あなたのレイアウトを持っている:

<MyLayout id="layout"> 
    <SomeImage id="image"/> 
    <SomeText> 
    <SomeInput> 
</MyLayout> 

それは画面ログインevernotesようなものです。 はその後、自分の活動に:

((MyLayout)findViewById(R.id.layout)).setOnSoftKeyboardListener(new OnSoftKeyboardListener() { 
     @Override 
     public void onShown() { 
      findViewById(R.id.image).setVisibility(View.GONE); 
     } 
     @Override 
     public void onHidden() { 
      findViewById(R.id.image).setVisibility(View.VISIBLE); 
     } 
    }); 

は、その後のmanifest.xmlに行くと設定

android:windowSoftInputMode="adjustResize" 

、ソフトキーボードが表示されたとき、それが画像を隠しますし、サイズが変更されますでどうなりますか残りのコンテンツ(あなたは実際にEvernoteでテキストのサイズを変更する方法を見ることができます)

画像の隠蔽は、もちろんあなたができる多くのことの一つです。しかし、異なるレイアウトの変更もonMeasureを呼び出すので注意する必要があります。

もちろん、それは汚れた変形です。オリエンテーションの変更、実際に測定を行うときの正しい時間、新しいスペックと古いスペックを比較するときにはもっと論理があるかどうかを確認する必要があります。しかし、私はこれを行う唯一の方法だと思います。

+1

私たちのプロジェクトでも同じアプローチを採用しています。それは嫌いですが、Android 2.xでIMEの表示/非表示のイベントをフックする唯一の方法だと思われます。 – Michael

+4

これにはいくつかのバグがあることがあります。このバージョンの方が良いです:http://stackoverflow.com/questions/2150078/android-is-software-keyboard-shown/4737265#4737265 –

+3

Galaxy S4では正しく動作しません。 if(oldSpec> newSpec)でelseを置き換えるにはif(oldSpec> newSpec).. else ...を変更する必要があります。現在のコードは、測定値が同じ場合にonHidden()を発生させます。 –

2

これはこれはあなたのOnCreate

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

使用"adjustResize"代わりのあるme..Putのために働いていましたAndroidManifest.xmlの "adjustPan"documentationから

<activity 
    ... 
    android:windowSoftInputMode="adjustResize" /> 

"adjustResize"
活動のメインウィンドウが常に画面上のソフトキーボードのための部屋を作るためにリサイズされます。

「adjustPan」
活動のメインウィンドウは、ソフトキーボード用のスペースを確保するためにリサイズされていません。むしろ、ウィンドウの内容は自動的にパンされ、現在のフォーカスがキーボードによって隠されることはなく、ユーザーはいつも入力しているものを見ることができます。これは、ウィンドウの不明瞭な部分に到達して対話するためにソフトキーボードを閉じる必要があるため、一般的にはサイズ変更よりも望ましくありません。

0

親の中のレイアウトにスクロールビューを使用し、マニフェストファイルからadjustpanまたはadjustresize設定を削除します。 レイアウトのScrollViewは、指定されたレイアウトでパンやレイアウトをスクロールする自由な機能を提供し、レイアウトを保護してツールバーやアクションバーをオーバーライドし、レイアウト内のボタンやテキストフィールドも非表示にします。基本レイアウト内でScrollViewを使用する必要があることを忘れないでください。このスクロールビューは、画面全体の基本レイアウトとして機能します。 例

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

<ScrollView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:fillViewport="true" 
    android:scrollbarStyle="insideInset" 
    android:scrollbars="vertical" > 

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

     <!-- Add here which you want --> 
    </LinearLayout> 
</ScrollView> 

1

選択答えは、フルスクリーンモードでは動作しません。 続いて一行ソリューションは、私の仕事:

AndroidBug5497Workaround.assistActivity(this); 

は、クラスをコピーAndroidBug5497Workaroundから:

Android How to adjust layout in Full Screen Mode when softkeyboard is visible

+0

ありがとうございました。私の場合は、レイアウトが複雑すぎて、アクティビティ内でキーボードが表示されたときに何らかの配置が行われた後に、メモリ不足でクラッシュする可能性があります。 – CoolMind

関連する問題