在开发登录界面时,点击某个EditText准备输入,弹出的软键盘遮挡了按钮或者下面的输入框,在完成这个文本框的输入后,想要继续下面的操作,需要先隐藏软键盘。这会影响用户操作的流畅感,所以需要解决。
问题如下:
image.png
解决方法
监听布局变化,当软键盘弹出时,滚动布局使显示出来。下面直接放代码。
activity_login.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/ll_root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusableInTouchMode="true"
android:orientation="vertical">
<include layout="@layout/toolbar_layout" />
<ScrollView
android:id="@+id/scrollView"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="80dp"
app:srcCompat="@mipmap/ic_launcher_round" />
<android.support.design.widget.TextInputLayout
android:id="@+id/textInputLayout1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="42dp"
android:layout_marginStart="42dp"
android:layout_marginTop="60dp">
<com.sunshuai.ramanspectrometer.widgets.DropEditText
android:id="@+id/edit_username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/username_hint"
android:singleLine="true" />
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:id="@+id/textInputLayout2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="42dp"
android:layout_marginStart="42dp"
android:layout_marginTop="3dp">
<EditText
android:id="@+id/edit_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="@string/password_hint"
android:inputType="textPassword"
android:singleLine="true" />
</android.support.design.widget.TextInputLayout>
<android.support.v7.widget.AppCompatButton
android:id="@+id/btn_login"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="42dp"
android:layout_marginStart="42dp"
android:layout_marginTop="30dp"
android:text="@string/login">
</android.support.v7.widget.AppCompatButton>
</LinearLayout>
</ScrollView>
</LinearLayout>
LoginActivity.java
package com.sunshuai.ramanspectrometer.login;
import android.graphics.Rect;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.Toast;
import com.sunshuai.ramanspectrometer.R;
import com.sunshuai.ramanspectrometer.base.BaseActivity;
import com.sunshuai.ramanspectrometer.device.MainActivity;
import com.sunshuai.ramanspectrometer.widgets.DropEditText;
import java.util.ArrayList;
import butterknife.BindView;
import butterknife.OnClick;
/**
* Created by sunshuai on 2018/1/16
*/
public class LoginActivity extends BaseActivity implements LoginContract.View {
private LoginContract.Presenter mPresenter;
private int scrollToPosition = 0;
@BindView(R.id.edit_username)
DropEditText editUserName;
@BindView(R.id.edit_password)
EditText editPassword;
@BindView(R.id.btn_login)
Button btnLogin;
@BindView(R.id.ll_root)
LinearLayout ll_root;
@BindView(R.id.scrollView)
ScrollView scrollView;
@OnClick(R.id.btn_login)
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_login:
if (TextUtils.isEmpty(editUserName.getText()) || TextUtils.isEmpty(editPassword.getText())) {
Toast.makeText(this, R.string.username_or_password_is_empty, Toast.LENGTH_SHORT).show();
} else {
mPresenter.login();
}
break;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPresenter = new LoginPresenter(this);
mPresenter.start();
}
@Override
protected void initView() {
super.initView();
autoScrollView(ll_root);
}
private void autoScrollView(final View rootView) {
rootView.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect rect = new Rect();
//获取root在窗体的可视区域
rootView.getWindowVisibleDisplayFrame(rect);
//获取root在窗体的不可视区域高度(被遮挡的高度)
int rootInvisibleHeight = rootView.getRootView().getHeight() - rect.bottom;
//若不可视区域高度大于150(键盘显示时)
if (rootInvisibleHeight > 150) {
scrollView.fullScroll(ScrollView.FOCUS_DOWN);
} else {
//键盘隐藏
scrollToPosition = 0;
}
rootView.scrollTo(0, scrollToPosition);
}
});
}
protected boolean isShowBacking() {
return false;
}
@Override
protected int getLayoutId() {
return R.layout.activity_login;
}
@Override
public void loadUserList(ArrayList<String> arrayList) {
UserAdapter userAdapter = new UserAdapter(this, arrayList);
editUserName.setAdapter(userAdapter);
}
@Override
public String getUserName() {
return editUserName.getText().toString();
}
@Override
public String getPassword() {
return editPassword.getText().toString();
}
@Override
public void loginSuccessManager() {
btnLogin.setText(R.string.login);
Toast.makeText(this, R.string.login_success_manager, Toast.LENGTH_SHORT).show();
jumpToActivity(MainActivity.class);
finish();
}
@Override
public void loginSuccessOthers() {
btnLogin.setText(R.string.login);
Toast.makeText(this, R.string.login_success_others, Toast.LENGTH_SHORT).show();
jumpToActivity(MainActivity.class);
finish();
}
@Override
public void loginFail() {
btnLogin.setText(R.string.login);
Toast.makeText(this, R.string.login_failed, Toast.LENGTH_SHORT).show();
}
@Override
public void showLogining() {
btnLogin.setText(R.string.logining);
}
@Override
public void setPresent(LoginContract.Presenter present) {
mPresenter = present;
}
}