监听软键盘的显示隐藏

在很多时候我们希望在软键盘显示和隐藏的时候,手动的修改布局,以便使软键盘弹出时更加界面呈现的更加美观。这时就需要对软键盘的显示隐藏进行监听。
 我们需要在软键盘显示和隐藏时,对主窗口进行了重新布局进行监听。如果我们设置的模式为压缩模式,那么我们可以对布局的onSizeChanged函数进行跟踪,如果为平移模式,那么该函数可能不会被调用。
    我们可以重写根布局,通常根布局的高度是不发生变化的。

    假设跟布局为线性布局,模式为压缩模式,我们写一个例子,当输入法弹出时隐藏某个view,输入法隐藏时显示某个view。

    public class ResizeLayout extends LinearLayout{  
        private OnResizeListener mListener; 
         
        public interface OnResizeListener { 
            void OnResize(int w, int h, int oldw, int oldh); 
        } 
         
        public void setOnResizeListener(OnResizeListener l) { 
            mListener = l; 
        } 
         
        public ResizeLayout(Context context, AttributeSet attrs) { 
            super(context, attrs); 
        } 
         
        @Override 
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {     
            super.onSizeChanged(w, h, oldw, oldh); 
             
            if (mListener != null) { 
                mListener.OnResize(w, h, oldw, oldh); 
            } 
        } 
    } 

在我们的Activity中,通过如下方法调用:

    public class MyActivity extends Activity { 
        private static final int BIG = 1; 
        private static final int SMALL = 2; 
        private static final int MSG_RESIZE = 1; 
                
        class InputHandler extends Handler { 
            @Override 
            public void handleMessage(Message msg) { 
                switch (msg.what) { 
                case MSG_RESIZE: { 
                    if (msg.arg1 == BIG) { 
                        findViewById(R.id.bottom_layout).setVisibility(View.VISIBLE); 
                    } else { 
                        findViewById(R.id.bottom_layout).setVisibility(View.GONE); 
                    } 
                } 
                    break; 
     
                default: 
                    break; 
                } 
                super.handleMessage(msg); 
            } 
        } 
         
        private InputHandler mHandler = new InputHandler(); 
         
        /** Called when the activity is first created. */ 
        @Override 
        public void onCreate(Bundle savedInstanceState) { 
            super.onCreate(savedInstanceState); 
            setContentView(R.layout.main); 
             
            ResizeLayout layout = (ResizeLayout) findViewById(R.id.root_layout); 
            layout.setOnResizeListener(new ResizeLayout.OnResizeListener() { 
                 
                public void OnResize(int w, int h, int oldw, int oldh) { 
                    int type = BIG; 
                    if (h < oldh) { 
                        change = SMALL; 
                    } 
                                     
                    Message msg = new Message(); 
                    msg.what = 1; 
                    msg.arg1 = type; 
                    mHandler.sendMessage(msg); 
                } 
            }); 
        } 
    } 

这里特别需要注意的是,不能直接在OnResizeListener中对要改变的View进行更改,因为OnSizeChanged函数实际上是运行在View的layout方法中,如果直接在onSizeChange中改变view的显示属性,那么很可能需要重新调用layout方法才能显示正确。然而我们的方法又是在layout中调用的,因此会出现错误。因此我们在例子中采用了Handler的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值