Android 소프트 키보드 부적 응 해결 방법 총화

Android 소프트 키보드 부적 응 해결 방법 총화
선언:
   많은 로그 인 인터페이스 를 쓰 는 개발 자 들 이 문 제 를 만 날 수 있 습 니 다.그것 은 바로 로그 인 인터페이스 에서 입력 상 자 를 클릭 할 때 아래 의 단 추 는 때때로 입력 상자 에 의 해 가 려 집 니 다.이것 은 사용자 의 체험 에 불리 하기 때문에 많은 사람들 이 소프트 키보드 가 튀 어 나 올 때 단 추 를 밀 어 낼 수 있 기 를 바 랍 니 다.많은 개발 자 들 이 키보드 의 상 태 를 감청 하려 고 하 는데 이것 은 의심 할 여지없이 매우 번 거 로 운 방법 이다.
       우 리 는 AndroidManifest.xml 의 Activity 에서 속성 을 설정 할 수 있 습 니 다.Android:windowSoftInputMode="adjustResize",소프트 키보드 가 팝 업 될 때 메 인 창 레이아웃 을 다시 배치 하고 onSize Changed 방법 을 호출 합 니 다.우리 가"adjustResize"로 설정 할 때 우리 의 화면 은 전체 화면 모드 로 설정 하지 마 십시오.그렇지 않 으 면 이 속성 을 설정 해도 아무런 효과 가 없습니다.안 드 로 이 드:windowSoftInputMode="adjustPan"을 설정 할 때 메 인 창 은 onSize Changed 방법 을 사용 하지 않 습 니 다.인터페이스의 일부분 은 소프트 키보드 로 덮 여 소프트 키보드 위로 밀 려 나 지 않 습 니 다.
우 리 는 코드 를 통 해 이 속성 을 설정 한 후에 입력 법 을 팝 업 할 때 시스템 이 무엇 을 했 는 지 테스트 합 니 다.
레이아웃 레이아웃 다시 쓰기:

public class ResizeLayout extends LinearLayout{ 
 private static int count = 0; 
  
 public ResizeLayout(Context context, AttributeSet attrs) { 
  super(context, attrs); 
 } 
  
 @Override 
 protected void onSizeChanged(int w, int h, int oldw, int oldh) {  
  super.onSizeChanged(w, h, oldw, oldh); 
   
  Log.e("onSizeChanged " + count++, "=>onResize called! w="+w + ",h="+h+",oldw="+oldw+",oldh="+oldh); 
 } 
  
 @Override 
 protected void onLayout(boolean changed, int l, int t, int r, int b) { 
  super.onLayout(changed, l, t, r, b); 
  Log.e("onLayout " + count++, "=>OnLayout called! l=" + l + ", t=" + t + ",r=" + r + ",b="+b); 
 } 
  
 @Override 
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
  super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
   
  Log.e("onMeasure " + count++, "=>onMeasure called! widthMeasureSpec=" + widthMeasureSpec + ", heightMeasureSpec=" + heightMeasureSpec); 
 } 
우리 의 레이아웃 은:

<com.winuxxan.inputMethodTest.ResizeLayout 
 xmlns:android="http://schemas.android.com/apk/res/android" 
 android:id="@+id/root_layout" 
 android:layout_width="fill_parent" 
 android:layout_height="fill_parent" 
 android:orientation="vertical" 
 > 
  
 <EditText 
  android:layout_width="fill_parent" 
  android:layout_height="wrap_content" 
 /> 
  
 <LinearLayout 
   android:id="@+id/bottom_layout" 
   android:layout_width="fill_parent" 
   android:layout_height="fill_parent" 
   android:orientation="vertical" 
   android:gravity="bottom">s 
  
 <TextView  
  android:layout_width="fill_parent" 
  android:layout_height="wrap_content" 
  android:text="@string/hello" 
  android:background="#77777777" 
  /> 
 </LinearLayout> 
</com.winuxxan.inputMethodTest.ResizeLayout> 
AndroidManifest.xml 의 Activity 설정 속성:android:windowSoftInputMode="adjustResize"
    프로그램 을 실행 하고 텍스트 상 자 를 클릭 하여 디 버 깅 정 보 를 봅 니 다.

 E/onMeasure 6(7960): =>onMeasure called! widthMeasureSpec=1073742144, heightMeasureSpec = 1073742024
 E/onMeasure 7(7960): =>onMeasure called! widthMeasureSpec=1073742144, heightMeasureSpec = 1073742025
 E/onSizeChanged 8(7960): =>onSizeChanged called! w=320,h=201,oldw=320,oldh=377
 E/onLayout 9(7960): =>OnLayout called! l=0, t=0,r=320,b=201
    디 버 깅 결 과 를 통 해 알 수 있 듯 이 텍스트 상 자 를 클릭 한 후에 루트 레이아웃 은 onMeasure,onSizeChanged 와 onLayout 를 호출 했 습 니 다.
  windowSoftInputMode 의 값 이 adjustPan 으로 설정 되면 이 Activity 메 인 창 은 소프트 키보드 의 공간 을 남기 기 위해 화면의 크기 를 조정 하지 않 습 니 다.반면 현재 창의 내용 은 키보드 로 덮어 쓰 지 않 고 사용자 가 입력 한 내용 을 항상 볼 수 있 도록 자동 으로 이동 합 니 다.이것 은 일반적으로 사용자 가 덮어 쓰 는 내용 과 의 상호작용 을 얻 기 위해 소프트 키 보드 를 닫 을 수 있 기 때문에 크기 조정 을 기대 하지 않 는 다.
    위의 예 에서 우 리 는 AndroidManifest.xml 의 속성 을 변경 합 니 다.android:windowSoftInputMode="adjustPan"
    다시 실행 하고 텍스트 상 자 를 클릭 하여 디 버 깅 정 보 를 봅 니 다.

 E/onMeasure 6(8378): =>onMeasure called! widthMeasureSpec=1073742144, heightMeasureSpec=1073742200
 E/onMeasure 7(8378): =>onMeasure called! widthMeasureSpec=1073742144, heightMeasureSpec=1073742201
 E/onLayout 8(8378): =>OnLayout called! l=0, t=0,r=320,b=377
    우 리 는 시스템 도 measrue 와 layot 를 다시 진행 하 였 으 나,layot 과정 에서 onSizeChanged 가 호출 되 지 않 았 음 을 발견 하 였 습 니 다.이것 은 입력 법 팝 업 전후 에 원래 레이아웃 의 크기 가 바 뀌 지 않 았 음 을 설명 합 니 다.
물론 다른 속성 을 설정 할 수 있 습 니 다:
"stateUnspecified"
소프트 키보드 의 상태 가 지정 되 지 않 았 습 니 다.시스템 은 적당 한 상 태 를 선택 하거나 테마 에 의존 하 는 설정 을 선택 할 것 입 니 다.
이것 은 소프트웨어 디스크 행 위 를 위 한 기본 설정 입 니 다.
"stateUnchanged"
부 드 러 운 키 보드 는 지난번 에 어떤 상 태 였 든 보이 거나 숨 겼 든 메 인 창 이 앞 에 나 타 났 을 때 유 지 됩 니 다.
"stateHidden"
사용자 가 이 Activity 를 선택 할 때 소프트 키 보드 는 숨겨 집 니 다.즉,사용자 가 이 Activity 로 탐색 하 는 것 을 확인 할 때 다른 Activity 를 떠 나 서 되 돌아 가 는 것 이 아 닙 니 다.
"stateAlwaysHidden"
소프트 키 보드 는 항상 숨겨 져 있 습 니 다.이 Activity 주 창 이 초점 을 가 져 올 때.
"stateVisible"
소프트 키 보드 는 볼 수 있 습 니 다.그것 이 정상 적 이 고 적당 할 때(사용자 가 Activity 메 인 창 으로 탐색 할 때).
"stateAlwaysVisible"
사용자 가 이 Activity 를 선택 할 때 소프트 키 보드 는 볼 수 있 습 니 다.즉,사용자 가 이 Activity 로 탐색 하 는 것 을 확인 할 때 다른 Activity 를 떠 나 서 돌아 가 는 것 이 아 닙 니 다.
"adjustUnspecified"
소프트 키보드 의 공간 을 남 길 수 있 도록 이 Activity 주 창 크기 를 조정 할 지,화면의 현재 초점 을 맞 출 지 여 부 는 지정 되 지 않 습 니 다.시스템 은 이 모드 에서 창의 내용 에 의존 하 는 레이아웃 보기 가 있 는 지 여 부 를 자동 으로 선택 합 니 다.이러한 보기 가 있 으 면 이 창 은 크기 를 조정 합 니 다.이러한 가설 은 스크롤 창의 내용 을 작은 영역 에서 볼 수 있 습 니 다.이것 은 주 창의 기본 행동 설정 입 니 다.
"adjustResize"
이 Activity 메 인 창 은 항상 소프트 키보드 의 공간 을 남기 기 위해 화면의 크기 를 조정 합 니 다.
"adjustPan"
이 Activity 메 인 창 은 소프트 키보드 의 공간 을 남기 기 위해 화면의 크기 를 조정 하지 않 습 니 다.반면 현재 창의 내용 은 키보드 로 덮어 쓰 지 않 고 사용자 가 입력 한 내용 을 항상 볼 수 있 도록 자동 으로 이동 합 니 다.이것 은 일반적으로 사용자 가 덮어 쓰 는 내용 과 의 상호작용 을 얻 기 위해 소프트 키 보드 를 닫 을 수 있 기 때문에 크기 조정 을 기대 하지 않 는 다.
읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기