Android 判斷軟鍵盤的狀態(顯示,隱藏)

先上截圖,有圖有真相:

自定義RelativeLayout

[java]
package com.demo.softkeyboard; 
 
import android.content.Context; 
import android.util.AttributeSet; 
import android.widget.RelativeLayout; 
 
public class KeyboardListenRelativeLayout extends RelativeLayout { 
     
    private static final String TAG = KeyboardListenRelativeLayout.class.getSimpleName(); 
     
    public static final byte KEYBOARD_STATE_SHOW = -3; 
    public static final byte KEYBOARD_STATE_HIDE = -2; 
    public static final byte KEYBOARD_STATE_INIT = -1; 
     
    private boolean mHasInit = false; 
    private boolean mHasKeyboard = false; 
    private int mHeight; 
     
    private IOnKeyboardStateChangedListener onKeyboardStateChangedListener; 
     
    public KeyboardListenRelativeLayout(Context context) { 
        super(context); 
    } 
    public KeyboardListenRelativeLayout(Context context, AttributeSet attrs) { 
        super(context, attrs); 
    } 
     
    public KeyboardListenRelativeLayout(Context context, AttributeSet attrs, int defStyle) { 
        super(context, attrs, defStyle); 
    } 
     
    public void setOnKeyboardStateChangedListener(IOnKeyboardStateChangedListener onKeyboardStateChangedListener) { 
        this.onKeyboardStateChangedListener = onKeyboardStateChangedListener; 
    } 
     
    @Override 
    protected void onLayout(boolean changed, int l, int t, int r, int b) { 
        super.onLayout(changed, l, t, r, b); 
        if(!mHasInit) { 
            mHasInit = true; 
            mHeight = b; 
            if(onKeyboardStateChangedListener != null) { 
                onKeyboardStateChangedListener.onKeyboardStateChanged(KEYBOARD_STATE_INIT); 
            } 
        } else { 
            mHeight = mHeight < b ? b : mHeight; 
        } 
         
        if(mHasInit && mHeight > b) { 
            mHasKeyboard = true; 
            if(onKeyboardStateChangedListener != null) { 
                onKeyboardStateChangedListener.onKeyboardStateChanged(KEYBOARD_STATE_SHOW); 
            } 
        } 
        if(mHasInit && mHasKeyboard && mHeight == b) { 
            mHasKeyboard = false; 
            if(onKeyboardStateChangedListener != null) { 
                onKeyboardStateChangedListener.onKeyboardStateChanged(KEYBOARD_STATE_HIDE); 
            } 
        } 
    } 
     
    public interface IOnKeyboardStateChangedListener { 
        public void onKeyboardStateChanged(int state); 
    } 

package com.demo.softkeyboard;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.RelativeLayout;

public class KeyboardListenRelativeLayout extends RelativeLayout {
 
 private static final String TAG = KeyboardListenRelativeLayout.class.getSimpleName();
 
 public static final byte KEYBOARD_STATE_SHOW = -3;
 public static final byte KEYBOARD_STATE_HIDE = -2;
 public static final byte KEYBOARD_STATE_INIT = -1;
 
 private boolean mHasInit = false;
 private boolean mHasKeyboard = false;
 private int mHeight;
 
 private IOnKeyboardStateChangedListener onKeyboardStateChangedListener;
 
 public KeyboardListenRelativeLayout(Context context) {
  super(context);
 }
 public KeyboardListenRelativeLayout(Context context, AttributeSet attrs) {
  super(context, attrs);
 }
 
 public KeyboardListenRelativeLayout(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);
 }
 
 public void setOnKeyboardStateChangedListener(IOnKeyboardStateChangedListener onKeyboardStateChangedListener) {
  this.onKeyboardStateChangedListener = onKeyboardStateChangedListener;
 }
 
 @Override
 protected void onLayout(boolean changed, int l, int t, int r, int b) {
  super.onLayout(changed, l, t, r, b);
  if(!mHasInit) {
   mHasInit = true;
   mHeight = b;
   if(onKeyboardStateChangedListener != null) {
    onKeyboardStateChangedListener.onKeyboardStateChanged(KEYBOARD_STATE_INIT);
   }
  } else {
   mHeight = mHeight < b ? b : mHeight;
  }
  
  if(mHasInit && mHeight > b) {
   mHasKeyboard = true;
   if(onKeyboardStateChangedListener != null) {
    onKeyboardStateChangedListener.onKeyboardStateChanged(KEYBOARD_STATE_SHOW);
   }
  }
  if(mHasInit && mHasKeyboard && mHeight == b) {
   mHasKeyboard = false;
   if(onKeyboardStateChangedListener != null) {
    onKeyboardStateChangedListener.onKeyboardStateChanged(KEYBOARD_STATE_HIDE);
   }
  }
 }
 
 public interface IOnKeyboardStateChangedListener {
  public void onKeyboardStateChanged(int state);
 }
}

用法:

[java]
package com.demo.softkeyboard; 
 
import com.demo.softkeyboard.KeyboardListenRelativeLayout.IOnKeyboardStateChangedListener; 
 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.EditText; 
import android.widget.TextView; 
 
/**
 * 軟鍵盤監聽Demo
 * @author qiaoning
 *
 */ 
public class SoftKeyboardListenDemoActivity extends Activity { 
     
    private EditText editText; 
    KeyboardListenRelativeLayout relativeLayout; 
     
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
         
        relativeLayout = (KeyboardListenRelativeLayout) findViewById(R.id.keyboardRelativeLayout); 
        editText = (EditText) findViewById(R.id.editText); 
         
        relativeLayout.setOnKeyboardStateChangedListener(new IOnKeyboardStateChangedListener() { 
             
            public void onKeyboardStateChanged(int state) { 
                switch (state) { 
                case KeyboardListenRelativeLayout.KEYBOARD_STATE_HIDE://軟鍵盤隱藏  
                    editText.setVisibility(View.VISIBLE); 
                    break; 
                case KeyboardListenRelativeLayout.KEYBOARD_STATE_SHOW://軟鍵盤顯示  
                    editText.setVisibility(View.GONE); 
                    break; 
                default: 
                    break; 
                } 
            } 
        }); 
    } 

package com.demo.softkeyboard;

import com.demo.softkeyboard.KeyboardListenRelativeLayout.IOnKeyboardStateChangedListener;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

/**
 * 軟鍵盤監聽Demo
 * @author qiaoning
 *
 */
public class SoftKeyboardListenDemoActivity extends Activity {
 
 private EditText editText;
 KeyboardListenRelativeLayout relativeLayout;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        relativeLayout = (KeyboardListenRelativeLayout) findViewById(R.id.keyboardRelativeLayout);
        editText = (EditText) findViewById(R.id.editText);
       
        relativeLayout.setOnKeyboardStateChangedListener(new IOnKeyboardStateChangedListener() {
   
   public void onKeyboardStateChanged(int state) {
    switch (state) {
    case KeyboardListenRelativeLayout.KEYBOARD_STATE_HIDE://軟鍵盤隱藏
     editText.setVisibility(View.VISIBLE);
     break;
    case KeyboardListenRelativeLayout.KEYBOARD_STATE_SHOW://軟鍵盤顯示
     editText.setVisibility(View.GONE);
     break;
    default:
     break;
    }
   }
  });
    }
}
使用到的佈局文件:

[html] view plaincopyprint?<?xml version="1.0" encoding="utf-8"?> 
<com.demo.softkeyboard.KeyboardListenRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/keyboardRelativeLayout" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <ScrollView android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        android:layout_alignParentLeft="true" 
        android:layout_alignParentTop="true" 
        android:fillViewport="true"> 
        <LinearLayout android:layout_width="fill_parent" 
            android:layout_height="wrap_content" 
            android:orientation="vertical"> 
            <EditText android:id="@+id/editText" 
                android:layout_width="fill_parent" 
                android:layout_height="wrap_content"/> 
        </LinearLayout> 
    </ScrollView> 
</com.demo.softkeyboard.KeyboardListenRelativeLayout> 
<?xml version="1.0" encoding="utf-8"?>
<com.demo.softkeyboard.KeyboardListenRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/keyboardRelativeLayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <ScrollView android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:fillViewport="true">
        <LinearLayout android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">
            <EditText android:id="@+id/editText"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"/>
        </LinearLayout>
    </ScrollView>
</com.demo.softkeyboard.KeyboardListenRelativeLayout>

 作者:qiaoning13256
 

 

發佈留言