优雅的方式解决软键盘遮挡按钮

5,788 阅读1分钟
原文链接: www.jianshu.com

比如在进行登录的操作中,用户输入完密码之后,肯定是想直接点击登录按钮的。返回键隐藏软键盘这样的体验肯定很糟糕,程序员,遇到问题解决问题。


实现1

xml

  

      

          

          

          

          

          

          

      

java

             mScrollView = (ScrollView) view.findViewById(R.id.scrollview);  
            usernamelogin_username.setOnTouchListener(new View.OnTouchListener() {  
                @Override  
                public boolean onTouch(View v, MotionEvent event) {  
                    changeScrollView();  

                    return false;  
                }  
            });  
            usernamelogin_password.setOnTouchListener(new View.OnTouchListener() {  
                @Override  
                public boolean onTouch(View v, MotionEvent event) {  
                    changeScrollView();  

                    return false;  
                }  
            });




  /** 
   * 使ScrollView指向底部 
   */  
      private void changeScrollView() {  
        new Handler().postDelayed(new Runnable() {  
          @Override  
          public void run() {  
            mScrollView.scrollTo(0, mScrollView.getHeight());  
          }  
      }, 300);  
    }

实现2

xml同上

anim下新建gone.xml


visiable.xml

  
  

或者直接在代码中

import android.os.Bundle;  
import android.os.Handler;  
import android.support.v7.app.AppCompatActivity;  
import android.view.KeyEvent;  
import android.view.MotionEvent;  
import android.view.View;  
import android.view.animation.Animation;  
import android.view.animation.AnimationSet;  
import android.view.animation.ScaleAnimation;  
import android.widget.Button;  
import android.widget.EditText;  
import android.widget.ImageView;  

public class MainActivity extends AppCompatActivity {  

private ImageView mHead;        //头部ImageView  

@Override  
protected void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.activity_main);  
    mHead = (ImageView) findViewById(R.id.iv_head);  
    final Button btn= (Button) findViewById(R.id.btn_usernamelogin_dologin);  

    final EditText et_pass = (EditText) findViewById(R.id.et_usernamelogin_password);  
    final EditText et_name = (EditText) findViewById(R.id.et_usernamelogin_username);  


    /** 
     * 当输入被点击 
     */  
    et_name.setOnTouchListener(new View.OnTouchListener() {  
        @Override  
        public boolean onTouch(View v, MotionEvent event) {  

            start();  

            return false;  
        }  
    });  

    btn.setEnabled(false);  

    btn.setOnClickListener(new View.OnClickListener() {  
        @Override  
        public void onClick(View v) {  


        }  
    });  


}  

private void start() {  
    AnimationSet animationSet = new AnimationSet(true);  
    ScaleAnimation scaleAnimation = new ScaleAnimation(  
            1, 0.1f, 1, 0.1f,  
            Animation.RELATIVE_TO_SELF, 0.5f,  
            Animation.RELATIVE_TO_SELF, 0.5f);  
    scaleAnimation.setDuration(500);  
    animationSet.addAnimation(scaleAnimation);  
    animationSet.setFillAfter(true);  
    animationSet.setFillBefore(false);  
    animationSet.setRepeatCount(0);//设置重复次数  
    mHead.startAnimation(scaleAnimation);  
    new Handler().postDelayed(new Runnable() {  
        @Override  
        public void run() {  
            mHead.setVisibility(View.GONE);  
        }  
    }, 500);  
}  

/** 
 * 菜单、返回键响应 
 */  
@Override  
public boolean onKeyDown(int keyCode, KeyEvent event) {  
    // TODO Auto-generated method stub  
    if (keyCode == KeyEvent.KEYCODE_BACK) {  
        if(mHead.getVisibility()==View.GONE){  
            AnimationSet animationSet = new AnimationSet(true);  
            ScaleAnimation scaleAnimation = new ScaleAnimation(  
                    0.1f, 1f, 0.1f, 1f,  
                    Animation.RELATIVE_TO_SELF, 0.5f,  
                    Animation.RELATIVE_TO_SELF, 0.5f);  
            scaleAnimation.setDuration(500);  
            animationSet.addAnimation(scaleAnimation);  
            animationSet.setFillAfter(true);  
            animationSet.setFillBefore(false);  
            mHead.startAnimation(scaleAnimation);  

            mHead.setVisibility(View.VISIBLE);  

        }else {  
            finish();  
        }  

    }  
    return false;  
  }  
}

效果呢: