728x90
반응형
질문 : Android에서 소프트웨어 키보드의 가시성을 확인하는 방법은 무엇입니까?
아주 간단한 일을해야합니다. 소프트웨어 키보드가 표시되는지 확인합니다. Android에서도 가능합니까?
답변
NEW ANSWER 2012 년 1 월 25 일 추가됨
아래 답변을 작성한 이후 누군가가 ViewTreeObserver 와 버전 1부터 SDK에 숨어있는 API의 존재에 대해 저를 단서했습니다.
사용자 지정 레이아웃 유형을 요구하는 것보다 훨씬 간단한 솔루션은 활동의 루트보기에 알려진 ID (예 : @+id/activityRoot
)를 제공하고 GlobalLayoutListener를 ViewTreeObserver에 연결 한 다음 거기에서 활동의보기 루트와 크기 차이를 계산하는 것입니다. 창 크기 :
final View activityRootView = findViewById(R.id.activityRoot);
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight();
if (heightDiff > dpToPx(this, 200)) { // if more than 200 dp, it's probably a keyboard...
// ... do something here
}
}
});
다음과 같은 유틸리티 사용 :
public static float dpToPx(Context context, float valueInDp) {
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, valueInDp, metrics);
}
쉬운!
참고 : android:windowSoftInputMode="adjustResize"
에서이 플래그를 설정해야합니다. 그렇지 않으면 위의 솔루션이 작동하지 않습니다.
원래 답변
예, 가능하지만,해야 할 것보다 훨씬 어렵습니다.
키보드가 언제 나타나고 사라지는 지 신경 써야한다면 (매우 자주) 최상위 레이아웃 클래스를 onMeasure()
를 재정의하는 클래스로 사용자 정의합니다. 기본 논리는 레이아웃이 창의 전체 영역보다 훨씬 적게 채워지면 소프트 키보드가 표시 될 수 있다는 것입니다.
import android.app.Activity;
import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.widget.LinearLayout;
/*
* LinearLayoutThatDetectsSoftKeyboard - a variant of LinearLayout that can detect when
* the soft keyboard is shown and hidden (something Android can't tell you, weirdly).
*/
public class LinearLayoutThatDetectsSoftKeyboard extends LinearLayout {
public LinearLayoutThatDetectsSoftKeyboard(Context context, AttributeSet attrs) {
super(context, attrs);
}
public interface Listener {
public void onSoftKeyboardShown(boolean isShowing);
}
private Listener listener;
public void setListener(Listener listener) {
this.listener = listener;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int height = MeasureSpec.getSize(heightMeasureSpec);
Activity activity = (Activity)getContext();
Rect rect = new Rect();
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
int statusBarHeight = rect.top;
int screenHeight = activity.getWindowManager().getDefaultDisplay().getHeight();
int diff = (screenHeight - statusBarHeight) - height;
if (listener != null) {
listener.onSoftKeyboardShown(diff>128); // assume all soft keyboards are at least 128 pixels high
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
그런 다음 활동 수업에서 ...
public class MyActivity extends Activity implements LinearLayoutThatDetectsSoftKeyboard.Listener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
LinearLayoutThatDetectsSoftKeyboard mainLayout = (LinearLayoutThatDetectsSoftKeyboard)findViewById(R.id.main);
mainLayout.setListener(this);
...
}
@Override
public void onSoftKeyboardShown(boolean isShowing) {
// do whatever you need to do here
}
...
}
출처 : https://stackoverflow.com/questions/2150078/how-to-check-visibility-of-software-keyboard-in-android
728x90
반응형
'프로그래밍 언어 > Android' 카테고리의 다른 글
google-services.json 구성을 여러 버전에 따라 다르게 만드는 방법 (0) | 2021.10.01 |
---|---|
Android에서 gravity와 layout_gravity의 차이점 (0) | 2021.10.01 |
Android에서 지연 후 메서드를 호출하는 방법 (0) | 2021.09.30 |
Android에서 텍스트를 굵게 변경하는 방법 (0) | 2021.09.29 |
Android 레이아웃 폴더에 하위 폴더를 포함하는 방법 (0) | 2021.09.29 |