로이드 수직 화면 전환, 처리 상태 변화 키보드 출시

배경 :

소형의 준비에 안드로이드 응용 프로그램, 이와 같은 문제가 발생 : 전화가 물리적 키보드를 열 때, 화면이 가로 세로로 변환 된 다음 응용 프로그램 (활동)의 디스플레이 인터페이스는,이 파괴됩니다 사람들이 더 우울합니다.

어떻게이 활동은 파괴되지 수 있습니까?

BACKGROUND 분할 선 ------------------------------------- ---------- -----------------------------------

문의 :

온라인 안드로이드 개발 그래서 몇 단락에서 :

(에 의해 정의 된 장치의 구성 경우 Resources.Configuration클래스) 변경 후 사용자 인터페이스를 표시하는 것을 그 구성과 일치하도록 업데이트해야합니다. 활동은 사용자와 상호 작용하기위한 기본 메커니즘이기 때문에 구성 변경 사항을 처리하기위한 특별한 지원이 포함되어 있습니다.

별도로 지정하지 않는 한, 현재의 활동을하게됩니다 (예 : 화면 방향, 언어, 입력 장치 등의 변화 등) 구성 변경이되는 파괴 의 정상적인 활동의 라이프 사이클 과정을 통해가는 onPause(), onStop()그리고 onDestroy()적절. 활동이 사용자에게 전경이나 볼에 있었다면, 일단 onDestroy()이전 인스턴스에서 생성 한 어떤 savedInstanceState와 함께, 다음 활동의 새로운 인스턴스를 생성 할 인스턴스에서 호출됩니다 onSaveInstanceState(Bundle).

특별한 경우에, 당신은 구성 변경 하나 개 이상의 유형에 따라 활동의 다시 시작 우회 할 수 있습니다. 이 작업은 이루어집니다 android:configChanges매니페스트의 속성. 당신이 처리 있다고 구성 변경의 유형, 당신은 당신의 현재 활동의를 호출 받게됩니다 onConfigurationChanged(Configuration)대신 다시 시작되는 방법을. 구성을 변경하면 처리하지 않는 하나를 포함하는 경우, 그러나, 활동은 여전히 다시 시작됩니다 및 onConfigurationChanged(Configuration)호출되지 않습니다.

당신의 활동이 구성 변경을 처리하는 선언하려면, 적절한 편집 <activity>인클루드하는 매니페스트 파일에 요소를 당신이 처리하려는 구성을 나타내는 문자열 값을 가진 속성을. 가능한 값은 설명서에 나와있는 속성 (가장 일반적으로 사용되는 값은 처리 할 때 화면 방향 변경 및 경우 키보드 가용성 변경 처리). 당신은 파이프 문자 ( "|")로 구분하여 속성에 여러 구성 값을 선언 할 수 있습니다. android:configChangesandroid:configChangesorientationkeyboardHidden

예를 들어, 다음과 같은 매니페스트 조각은 화면 방향 변화와 키보드 가용성 변화를 모두 처리하는 활동을 선언합니다 :

<활동 안드로이드 : 이름 = "MyActivity." 
          안드로이드 : configChanges = "오리엔테이션 | keyboardHidden" 
          안드로이드 : 라벨 = "@ 문자열 / APP_NAME">

이러한 구성 중 하나를 변경하면 이제 MyActivity다시 시작되지 않습니다. 대신, 활동에 대한 호출을 받는다 onConfigurationChanged(). 이 방법은 전달 된 Configuration새로운 장치 구성을 지정하는 개체. 필드를 읽어 보면 Configuration, 당신은 새로운 구성을 확인할 수 있습니다 및 인터페이스에서 사용하는 리소스를 업데이트하여 적절하게 변경합니다. 이 메소드가 호출되는 시점에서, 당신의 활동의 Resources목적은 새로운 구성에 따라 자원을 반환하도록 업데이트됩니다, 그래서 당신은 쉽게 활동을 다시 시작 시스템없이 UI의 요소를 재설정 할 수 있습니다.

------------------------------------ 분할 선 ------------ -----------------------------

해결 방법 :

위의 정보를 읽어서,이 솔루션은 매우 간단합니다.

처음에 요소 Mainifest.xml 활동을 추가 안드로이드 : configChanges = "오리엔테이션 | keyboardHidden " 재산

< 활동  안드로이드 : 이름 = ". FileBrowser"
          안드로이드 : 라벨 = "@ 문자열 / APP_NAME"
          안드로이드 : configChanges = "오리엔테이션 | keyboardHidden" >
    < 의도 필터 >
        < 액션  안드로이드 : 이름 = "android.intent.action.MAIN"  />
        < 카테고리  로이드 이름 = "android.intent.category.LAUNCHER"  />
    </ 텐트 필터 >
</ 활동 >

응용 프로그램이 키보드와 화면 배향 상태 (또는 가까운 해제) 변경 정보를 처리하는 것을 의미이 속성을 추가합니다. 그러나, 장치 구성 정보의 다른 변형은 시스템 안드로이드 (파괴 현재 활동하고 새 활동 인스턴스를 다시 시작)에 의해 처리된다.

그래서, 지금 당신은 활동의 서브 클래스 자바 코드에서 코드 변경을 처리하는 구성 정보를 추가해야합니다. 이것은 또한 매우 간단합니다

/ **
 *의 onConfigurationChanged
 * 패키지 : android.content.res.Configuration.
 * @param newConfig 새로운 장치 구성.
 * 때 (예컨대 화면 방향의 변화, 물리적 키보드 또는 폐쇄 가압 등) 변화 디바이스 구성 정보,
 *이 시간에 활동과 실행이있는 경우, 시스템은이 함수를 호출합니다.
 * 참고 :의 onConfigurationChanged는 AnroidMainifest.xml하여 응용 프로그램을 모니터링합니다
 * 안드로이드 : configChanges가 = "XXXX"가 구성 변경의 종류를 지정한다;
 * 다른 구성 변경의 경우, 시스템들의 OnDestroy합니다 () 현재 활동하고 새 활동 인스턴스를 다시 시작합니다.
 * /
@보수
공공  무효 의 onConfigurationChanged (구성 newConfig) {    
    슈퍼 .onConfigurationChanged (newConfig);
    // 테스트 화면 방향 : 세로 또는 가로
    경우 (  .getResources (). getConfiguration를 (). 배향
            == Configuration.ORIENTATION_LANDSCAPE) {
        추가 처리 코드를 추가 // 현재 풍경,
    }
    다른  경우 (  .getResources (). getConfiguration를 (). 오리엔테이션
            == Configuration.ORIENTATION_PORTRAIT) {
        추가 처리 코드를 추가 // 현재 수직 화면,
    }
    릴리스 또는 폐쇄 : // 상태 실제 키보드를 감지    
    경우 newConfig.hardKeyboardHidden (
            == Configuration.HARDKEYBOARDHIDDEN_NO) { 
        여기에 추가 처리 코드를 추가 발사 상태에서 // 실제 키보드,
    } 
    다른  경우 newConfig.hardKeyboardHidden (
            == Configuration.HARDKEYBOARDHIDDEN_YES) { 
        여기에 추가 처리 코드를 추가 폐쇄 위치에 // 실제 키보드,
    }
}
자바 파일에 추가하는 것을 잊지 마십시오 가져 오기 android.content.res.Configuration .

그래서 OK, 시간이 화면 방향을 변경하려면 응용 프로그램의 디스플레이 인터페이스 대신 파괴의 변경 사항과 함께합니다!

----------------------------------- 여전히 광고 분할 ------------ ---------------------------------

확장 추가 :

재산의 활동과 관련된 화면 방향이있다 :

< 활동 
   . . .
      android:screenOrientation=["unspecified" | "user" | "behind" |
                                 "landscape" | "portrait" |
                                 "sensor" | "nosensor"]
    . . .
&lt;/activity>

比如,在Mainifest.xml的Activity元素中增加这么一个属性:

android:screenOrientation="portrait"

则无论手机如何变动,拥有这个属性的activity都将是竖屏显示。

android:screenOrientation="landscape“为横屏显示。

这里提一个小知识,Anroid模拟器中,快捷键"ctrl+F11"可以实现转屏。


横竖屏切换后可采用不同的布局文件,方法如下:


默认情况下(竖屏)是调用res/layout 中的布局,如果要自定义横屏时的布局,可以在res/目录下新建一个layout-land 文件,在这个文件夹中放置横屏的布局,横竖屏的XML 文件的名字必须一样。=====

layout-port和layout-land

-----
在activity中做判断,代码如下:
Configuration newConfig = getResources().getConfiguration();" w/ j4 `: ]5 S0 ~) \/ D+ |
if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){
//横屏时
setContentView(R.id.landscape);
}else if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
//竖屏时
setContentView(R.id.portrait);( o) y' l/ e3 \& \2 u
}6


转自http://www.cnblogs.com/hibraincol/archive/2010/09/18/1829862.html

转载于:https://www.cnblogs.com/moiyer/archive/2011/10/26/2316163.html

추천

출처blog.csdn.net/weixin_34199405/article/details/94693171