zoukankan      html  css  js  c++  java
  • android 对软键盘显示和消失,EditView的焦点获取事件进行监听

     软键盘

     

    注释:

        原理就是根据当前布局所占屏幕总高度减去当前布局可视高度,一般刚进入Activity,这两个高度相差不多,数值必定小于100,当软键盘出现时,当前布局的可视高度会受到挤压,两者相减大于100(软键盘一般大小差不多为总屏幕的4分之一,100是比较合适的数值)

    但是有个问题就是,如果当前页面可以滚动,在软键盘消失后进行滚动,安卓会重新计算当前布局可视高度,默认为初始可视高度的值,如上的方法会连续闪现隐藏和show两种不同状态,可通过判断只有走过show方法,才判断hide方法为有效,可完美规避此类问题。

    另外如果在fragment里需要对软键盘消失监控,可通过在Activity里对hide和show的状态发广播,然后在需要的地方进行接收处理

    1、配置文件中添加

    <activity
                android:name="com.resmanager.client.user.LoginActivity"
                android:windowSoftInputMode="adjustResize"
                android:label="@string/app_name"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.NoTitleBar" >
            </activity>

    2、Activity中

      //该Activity的最外层Layout
             final LinearLayout father = (LinearLayout) findViewById(R.id.father);// private LinearLayout activityRootView;
            //给该layout设置监听,监听其布局发生变化事件
             father.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                    @Override
                    public void onGlobalLayout() {
                        //比较Activity根布局与当前布局的大小
                        int heightDiff = father.getRootView().getHeight() - father.getHeight();
                        if (heightDiff > dpToPx(LoginActivity.this, 200)) { // if more than 200 dp, it's probably a keyboard...
                            // ... do something here
                            Log.d("TAG","aaaa");//显示
                            LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT,
                                    ViewGroup.LayoutParams.WRAP_CONTENT);
                            lp.setMargins(0, 0, 0, 0);//left top right button
                           up.setLayoutParams(lp);
                           uptwo.setLayoutParams(lp);
                           hidden.setVisibility(View.GONE);

                          //上面代码等价于:

                          //Android:layout_marginTop="0dip"


                        }else {
                            Log.d("TAG","bbbb");//消失
                            LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT,
                                    ViewGroup.LayoutParams.WRAP_CONTENT);
                            lp.setMargins(0,45, 0, 0);//left top right button
                           up.setLayoutParams(lp);
                           lp.setMargins(0, 50, 0, 0);
                           uptwo.setLayoutParams(lp);
                           hidden.setVisibility(View.VISIBLE);

                        }
                    }
                }); 


            public static float dpToPx(Context context, float valueInDp) {
                DisplayMetrics metrics = context.getResources().getDisplayMetrics();
                return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, valueInDp, metrics);

        }

    3、Layout中

       <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:id="@+id/father"
        android:focusable="true"  
        android:focusableInTouchMode="true"
        android:orientation="vertical"
        android:layout_weight="12">

    4软键盘出现后,即使没操作也默认会把原来Activity的布局给顶上去了,感觉没必要的话,可以配置文件中更改

    android:windowSoftInputMode="adjustPan|stateHidden"

    EditView

    user_account_edit.setOnFocusChangeListener(new android.view.View.
                    OnFocusChangeListener() {
                @Override
                public void onFocusChange(View v, boolean hasFocus) {
                    if (hasFocus) {
                        // 此处为得到焦点时的处理内容
                  
                         
                    
                    } else {
                        // 此处为失去焦点时的处理内容
                 
                    }
                }
            });

    Android 如何在Java代码中手动设置控件的marginleft

     

    1、定义LayoutParams

    1
    LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);//定义一个LayoutParams

    2、在LayoutParams中设置marginLeft

    1
    layoutParams.setMargins(20,0,0,0);//4个参数按顺序分别是左上右下

    3、把这个LayoutParams设置给控件

    1
    mView.setLayoutParams(layoutParams); //mView是控件

     

     

  • 相关阅读:
    KnockOut循环绑定
    json数组排序
    1,滑动验证,前后台接口
    写个js程序咖常写的游戏-贪吃蛇
    ionic的路由配置及参数传递
    基于jq, jquery.easie.js 开发面向对象通栏焦点图组件
    面向对象开发弹窗组件
    基于jquery开发的选项卡
    JavaScript多线程 html5 Worker, SharedWorker
    gulp常用任务
  • 原文地址:https://www.cnblogs.com/huangahuo/p/7382290.html
Copyright © 2011-2022 走看看