내가 사방 검색했습니다 전혀이 일을 어떤 방식으로 찾을 수 없습니다 : 하나는 "레이아웃"이라고하며, 다른 하나는 "레이아웃이라고 :런타임에 가로 버전의 레이아웃 존재를 감지하는 방법은 무엇입니까?
을 내 프로젝트에서를, 나는 레이아웃에 두 개의 자원 폴더가 -땅". 이것은 현재 방향에 따라 사용되는 각 Activity에 대해 두 개의 개별 레이아웃을 갖는 친숙한 방법입니다. 문제는 모든 액티비티에 대해 별도의 "레이아웃 - 랜드"레이아웃이 없으며 모든 액티비티가 가로 모드의 다른 레이아웃을 필요로하지 않는다는 것입니다.
내가 수행 한 작업은 방향 변경이 발생하지 않도록 기본값 onConfigurationChanged
을 재정의합니다 (해당 configChanges="orientation"
을 매니페스트에 사용). 이것은 사용자가 화면을 기울일 때마다 번들로 물건을 채우는 두통을 덜어 줬습니다. 그러나 경우에 따라 실제로는 이 방향 변경을 원합니다. "layout-land"폴더에 해당 레이아웃이있을 때마다 평소와 같이 방향이 바뀌길 원합니다. 없을 때마다 onConfigurationChanged
방향 변경 이벤트를 억제하고 싶습니다.
나는 Activity
를 확장하고 내 모든 활동의 기본 클래스 인 부모 BaseActivity
클래스를 만들고, onConfigurationChanged
오버라이드 :
@Override
public void onConfigurationChanged(android.content.res.Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
if(...there is a layout-land version of the current activity's layout...)
{
setRequestedOrientation(newConfig.orientation);
}
else
{
// Do nothing, since raising the orientation change event
// to change from a portrait layout to the same portrait layout is silly.
}
}
만하다가 내가 여부를 결정하는 어떤 방법을 찾을 수 있다는 것입니다 내 레이아웃 리소스의 레이아웃 랜드 버전이 있습니다. 이미 (setContentView
을 무시하여) 내 BaseActivity
클래스의 다른 위치에서 얻은 현재 레이아웃의 리소스 ID를 알고 있지만 레이아웃의 가로 버전과 세로 버전 모두 동일한 ID를 공유하고 있습니다. Resources
개체를위한 쉬운 방법은 없습니다. ID로 특정 리소스를 요청할 때 어떤 버전의 레이아웃을 말해 주는지 알려주십시오. 이것을 할 수있는 방법이 있어야합니다. 내가 뭘 놓치고 있니?
상태를 저장하지 않아도되도록'onConfigurationChanged()'를 재정의하는 것은 나쁜 습관 일뿐입니다. 나중에 다시 물으려고합니다. – kcoppock
'onSaveInstanceState'의 전체 존재는 나쁜 습관입니다. 사용자가 전화를 돌렸을 때만 응용 프로그램을 완전히 폐기 할 준비가되어 있어야한다는 생각은 잘못된 디자인입니다. 또한 _how_는 상태를 저장하지 않으므로 다시 물지 않습니다. 이 작업을 수행하는 유일한 이유는 사용자가 화면을 기울이는 정확한 시간에 대화 상자가 나타날 수있는 상황을 피하기 위해서입니다. 사용자 데이터는 변경 될 때마다 (필요할 경우 'onSaveInstanceState'포함) 내 앱에 저장됩니다. – Alex
앱이 실행 중이며 사용자가 알림을 열기로 결정했다고 가정 해 보겠습니다. 앱이 백그라운드에 있습니다. 메모리 사용량에 따라 사용자가 완료되기 전에 앱이 중지되거나 삭제 될 수 있습니다 (적어도 중단됩니다). 사용자가 "뒤로"를 클릭하여 활동으로 돌아 오면 활동이 다시 작성되고 해당 활동 인스턴스에 포함 된 모든 데이터는 사라집니다. – kcoppock