適応ソフトキーボードのDialogおよびリスニングソフトキーボードのイジェクト

5037 ワード

最近のプロジェクトでは、初心者向けのブートが必要です.一般的な初心者ガイドとあまり違いはありませんが、考え方はシャドウ付きのマスク層を作って、上にヒント的な文字をあげて、需要の中に特殊なところがあるので、私は全画面のdialog(しかも、dialogはシャドウ効果を持っています)を使って初心者ガイドとしてこの需要をしました.
キーボードをイジェクト
キーボードの上の特定の位置にブートを表示
この需要の中で2つの点を考慮する必要があります:1.Dialogのレイアウトはソフトキーボードの弾き上げに適応しなければならない.ソフトキーボードの弾き上がりと受け取るときは違う誘導があるので、Dialogでソフトキーボードの弾き上がりを傍受します.
需要の解決:一:キーボードの弾き上がりに適応する.Activityでレイアウトをソフトキーボードで遮らないようにするには、リストファイルにwindowSoftInputModeプロパティを配置するのが一般的であり、windowSoftInputModeはAndroid 1であることが知られている.5以降の新しい特性は、主にソフトキーボードに対して操作され、主に以下の属性があります.
stateUnspecified:ソフトキーボードのステータスは指定されていません.適切なステータスまたはトピックに依存する設定が選択されます.
stateUnchanged:このactivityが表示されると、ソフトキーボードは隠しても表示しても前のactivityの状態に保たれます.
stateHidden:ユーザーがactivityを選択すると、ソフトキーボードは常に非表示になります.
stateAlwaysHidden:Activityメインウィンドウがフォーカスされると、ソフトキーボードも常に非表示になります.
stateVisible:通常、ソフトキーボードは表示されます.
stateAlwaysVisible:ユーザーがactivityを選択した場合、ソフトキーボードが常に表示される状態
adjustUnspecified:デフォルト設定は、通常、システムによって非表示か表示かが自動的に決定されます.
adjustResize:Activityは常に画面のサイズを調整してソフトキーボードのスペースを残す
adjustPan:現在のウィンドウの内容は自動的に移動し、現在のフォーカスがキーボードで上書きされず、ユーザーが常に入力内容の部分を見ることができるようにします.
必要に応じてリストファイルに具体的なプロパティを設定できますが、ソフトキーボードがDialogに基づいて飛び出している場合はどうすればいいのでしょうか.Dialogのプロパティを構成するリストファイルはありません.実際には、リストに構成されている属性の本質も、現在のインタフェースがソフトキーボードの場合の処理を示しています.WindowSoftInputModeのプロパティをインベントリファイルに設定すると、android:windowSoftInputMode=「stateHidden|adjustPan」と書きます.
実はリストファイルの中のいくつかの配置で、私達はActivityでも配置することができて、Activityの中でコードで話を設定するのはこのように書きます:getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
賢いあなたはここで何かを見たかもしれません.間違いありません.2つの方法の実質は、現在のウィンドウのインスタンスを得て、現在のウィンドウに基づいて設定することです.ソースコードに入ってみましょう.まずgetWindow()の方法を見てみましょう.
文/甄某某某(簡書作者)
テキストリンク:http://www.jianshu.com/p/9a71a46c77ab
著作権は作者の所有で、転載は作者に連絡して授権を得て、そして“簡書の作者”を表示してください.
android:windowSoftInputMode="stateHidden|adjustPan"

実はリストファイルの中のいくつかの構成は、Activityでも構成できます.Activityでコード設定の話はこのように書かれています.
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

賢いあなたはここで何かを見たかもしれません.間違いありません.2つの方法の実質は、現在のウィンドウのインスタンスを得て、現在のウィンドウに基づいて設定することです.ソースコードに入ってみましょう.まずgetWindow()の方法を見てみましょう.
public Window getWindow() { return mWindow; }

簡単に、現在のWindowインスタンスを取得し、setSoftInputModeという方法に入ります.
public void setSoftInputMode(int mode) { 
    final WindowManager.LayoutParams attrs = getAttributes(); 
    if (mode !=   WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED) 
   {      
   attrs.softInputMode = mode; mHasSoftInputMode = true;
    } else {
   mHasSoftInputMode = false;
   }
  if (mCallback != null) {
      mCallback.onWindowAttributesChanged(attrs); 
   }
 }

この方法は短くて論理的ではっきりしていて、最後から3行目のコードが見えて、ウィンドウの属性が変化すると、mCallbackは1つの方法をコールバックしていくつかの操作を実行します.では、これ、mCallbackは何ですか.ソースコードで検索すると、次のコードとコメントが表示されます.
/** * Set the Callback interface for this window, used to intercept key 
* events and other dynamic operations in the window.
 * * @param callback The desired Callback interface. 
*/ 
public void setCallback(Callback callback) { 
     mCallback = callback;
 }

注記mCallbackは、現在のウィンドウに設定されているコールバックインタフェースであり、ウィンドウに何らかの変化が発生した場合にこのコールバックインタフェースで何らかの操作を実行できることがわかります.mCallbackに戻ります.onWindowAttributesChanged(attrs)というコードは、まずActivityがこのインタフェースを実現したに違いないことを知っています.では、他にこのインタフェースを実現したものはありますか.このインタフェースを定義する場所を見つけます.
This is called whenever the current window attributes change.      
 public void onWindowAttributesChanged(WindowManager.LayoutParams attrs); 


注釈によって、ウィンドウのプロパティが変化すると呼び出されるインタフェースの用途も明らかになります.Android Studioでは、このインタフェース定義の左側の上向き矢印をクリックしてインタフェースの実装クラスを表示することができます.dialogもこのインタフェースを実装していることがわかりました.最初のニーズに戻ると、解決方法は簡単になります.Dialogをカスタマイズして、onCreateメソッドを書き直します.以下のようにします.
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState);   getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); 
}

実はActivityで設定したのと同じです.
二、Dialogに基づいてソフトキーボードの弾き上げと受け取りを傍受する:実は最初の需要を見終わって、私達はすでに推測して、ソフトキーボードも現在のウィンドウに基づいて、その弾き上げと受け取りはきっと現在のウィンドウのレイアウトの属性の変化を引き起こすことができて、だから解決の構想はあります:現在のレイアウトの変化を傍受します.ここではレイアウト座標の下座標を比較します.キーボードが弾けば、レイアウトの下座標が小さくなるに違いないからです.具体的なコードは以下の通りです.
@Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 
         if (oldBottom != 0 && bottom != 0 && (oldBottom - bottom > 0))
         {//               doSomethinh.. 
         } else if (oldBottom != 0 && bottom != 0 && (bottom - oldBottom > 0)) 
         {//            doSomethinh.. } }

onLayoutChangeという方法はウィンドウレイアウトが変わったときにコールバックされ、興味のある方はソースコードを見に行って、注釈がはっきりしています.このコールバック法ではパラメータは,後viewの左上右下の座標を変更し,前viewの座標を変更する.