안드로이드 전체 화면 소프트 키보드 수신
20010 단어 공구.
/**
*
* @param activity
*/
public static void showKeybord(Activity activity,EditText et) {
InputMethodManager imm = (InputMethodManager)activity.getSystemService(Context.INPUT_METHOD_SERVICE);
if(imm != null) {
imm.showSoftInput(et, 0);
}
}
/**
*
* @param activity
*/
public static void closeKeybord(Activity activity) {
InputMethodManager imm = (InputMethodManager)activity.getSystemService(Context.INPUT_METHOD_SERVICE);
if(imm != null) {
imm.hideSoftInputFromWindow(activity.getWindow().getDecorView().getWindowToken(), 0);
}
}
Activity 테마(Theme)가 전체 화면 테마(fullscreen)가 아닌 몰입식으로 개발되었을 때, DecordView를 통해 ViewTreeObserve를 가져와 Layout의 변화를 감청할 수 있지만, 전체 화면 테마를 사용할 때 감청이 아무런 작용이 없다는 것을 알게 되면 인터넷에서 베낀 Utils도 모두 효력을 상실하게 된다.
그러면 우리는 전체 화면에서 소프트 키보드의 상태를 감청하여 우리의 개발 업무의 수요에 부합할 수 있습니까?
정답은 긍정적입니다.
우리는 팝윈도를 추가해서 소프트 키보드를 감청할 수 없는 문제를 해결하고 코드에 직접 올릴 수 있다
public class FullScreenKeyboardHeightProvider extends PopupWindow implements OnGlobalLayoutListener {
private Activity mActivity;
private View mRootView;
private HeightListener mHeightListener;
private int mHeightMax; // popup
private int mKeyboardHeight;
public FullScreenKeyboardHeightProvider(Activity activity) {
super(activity);
this.mActivity = activity;
//
mRootView = new View(activity);
setContentView(mRootView);
// Layout
mRootView.getViewTreeObserver().addOnGlobalLayoutListener(this);
setBackgroundDrawable(new ColorDrawable(0));
// 0,
setWidth(0);
setHeight(LayoutParams.MATCH_PARENT);
//
setSoftInputMode(LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
}
public FullScreenKeyboardHeightProvider init() {
if (!isShowing()) {
final View view = mActivity.getWindow().getDecorView();
// popupwindow,
view.post(new Runnable() {
@Override
public void run() {
showAtLocation(view, Gravity.NO_GRAVITY, 0, 0);
}
});
}
return this;
}
public FullScreenKeyboardHeightProvider setHeightListener(HeightListener listener) {
this.mHeightListener = listener;
return this;
}
@Override
public void onGlobalLayout() {
Rect rect = new Rect();
mRootView.getWindowVisibleDisplayFrame(rect);
if (rect.bottom > mHeightMax) {
mHeightMax = rect.bottom;
}
//
int currentKeyboardHeight = mHeightMax - rect.bottom;
if (currentKeyboardHeight==mKeyboardHeight){
return;
}
//
if (mHeightListener != null) {
ValueAnimator valueAnimator = ValueAnimator.ofInt(mKeyboardHeight, currentKeyboardHeight);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int animatedValue = (int) animation.getAnimatedValue();
mHeightListener.onHeightChanged(animatedValue);
}
});
valueAnimator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
mKeyboardHeight = currentKeyboardHeight;
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
mHeightListener.onHeightChanged(mKeyboardHeight);
valueAnimator.setDuration(200);
valueAnimator.setInterpolator(new DecelerateInterpolator());
valueAnimator.start();
}
}
public interface HeightListener {
void onHeightChanged(int height);
}
}
demo 다운로드 주소
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
BeanUtils에서 맵을 개체로 직접 캡슐화폼에서 제출한 데이터를 대상에 봉인하는 것이 필요합니다 대상order 프론트 데스크톱 페이지:name 속성과 대상 속성이 일일이 대응합니다 웹 층 봉인 프론트 데스크톱의 데이터를 키 값 대 맵에 저장합니다 Map m...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.