배경 :
소형의 준비에 안드로이드 응용 프로그램, 이와 같은 문제가 발생 : 전화가 물리적 키보드를 열 때, 화면이 가로 세로로 변환 된 다음 응용 프로그램 (활동)의 디스플레이 인터페이스는,이 파괴됩니다 사람들이 더 우울합니다.
어떻게이 활동은 파괴되지 수 있습니까?
BACKGROUND 분할 선 ------------------------------------- ---------- -----------------------------------
문의 :
온라인 안드로이드 개발 그래서 몇 단락에서 :
(에 의해 정의 된 장치의 구성 경우 Resources.Configuration
클래스) 변경 후 사용자 인터페이스를 표시하는 것을 그 구성과 일치하도록 업데이트해야합니다. 활동은 사용자와 상호 작용하기위한 기본 메커니즘이기 때문에 구성 변경 사항을 처리하기위한 특별한 지원이 포함되어 있습니다.
별도로 지정하지 않는 한, 현재의 활동을하게됩니다 (예 : 화면 방향, 언어, 입력 장치 등의 변화 등) 구성 변경이되는 파괴 의 정상적인 활동의 라이프 사이클 과정을 통해가는 onPause()
, onStop()
그리고 onDestroy()
적절. 활동이 사용자에게 전경이나 볼에 있었다면, 일단 onDestroy()
이전 인스턴스에서 생성 한 어떤 savedInstanceState와 함께, 다음 활동의 새로운 인스턴스를 생성 할 인스턴스에서 호출됩니다 onSaveInstanceState(Bundle)
.
특별한 경우에, 당신은 구성 변경 하나 개 이상의 유형에 따라 활동의 다시 시작 우회 할 수 있습니다. 이 작업은 이루어집니다 android:configChanges
매니페스트의 속성. 당신이 처리 있다고 구성 변경의 유형, 당신은 당신의 현재 활동의를 호출 받게됩니다 onConfigurationChanged(Configuration)
대신 다시 시작되는 방법을. 구성을 변경하면 처리하지 않는 하나를 포함하는 경우, 그러나, 활동은 여전히 다시 시작됩니다 및 onConfigurationChanged(Configuration)
호출되지 않습니다.
당신의 활동이 구성 변경을 처리하는 선언하려면, 적절한 편집 <activity>
인클루드하는 매니페스트 파일에 요소를 당신이 처리하려는 구성을 나타내는 문자열 값을 가진 속성을. 가능한 값은 설명서에 나와있는 속성 (가장 일반적으로 사용되는 값은 처리 할 때 화면 방향 변경 및 경우 키보드 가용성 변경 처리). 당신은 파이프 문자 ( "|")로 구분하여 속성에 여러 구성 값을 선언 할 수 있습니다. android:configChanges
android:configChanges
orientation
keyboardHidden
예를 들어, 다음과 같은 매니페스트 조각은 화면 방향 변화와 키보드 가용성 변화를 모두 처리하는 활동을 선언합니다 :
<활동 안드로이드 : 이름 = "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) {
여기에 추가 처리 코드를 추가 폐쇄 위치에 // 실제 키보드,
}
}
그래서 OK, 시간이 화면 방향을 변경하려면 응용 프로그램의 디스플레이 인터페이스 대신 파괴의 변경 사항과 함께합니다!
----------------------------------- 여전히 광고 분할 ------------ ---------------------------------
확장 추가 :
재산의 활동과 관련된 화면 방향이있다 :
< 활동
. . .
android:screenOrientation=["unspecified" | "user" | "behind" |
"landscape" | "portrait" |
"sensor" | "nosensor"]
. . .
</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