문제

나는 그것을 시작한 의도의 데이터에서 오리엔테이션을 결정하는 활동을 올바르게 처리하는 방법을 찾으려고 노력하고 있습니다. 이것은 사용자가 레벨을 선택할 수있는 게임을위한 것이며, 그 중 일부는 인물 사진 방향이며 일부는 풍경 방향입니다. 내가 겪고있는 문제는 그 것입니다 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) 활동이 완전히로드 될 때까지 적용되지 않습니다. 시작하는 동안 로딩 및 이미지 처리를 수행하기 때문에 이것은 문제입니다.

현재 사용자가 조경 수준을 선택한 경우 :

  • 활동은 oncreate ()를 시작하여 초상화에 대한 기본값
  • 런칭 의도를 분석하여 조경 방향에 있어야한다는 것을 알게됩니다.
  • OnResume ()까지 모든 길을 계속하고 정보를로드하고 다른 설정 작업을 수행합니다.
  • 이 시점에서 SetRequestEdorientation이 시작되어 응용 프로그램이 OnPause ()를 통해 ondestroy ()로 실행됩니다.
  • 그런 다음 다시 OnCreate ()에서 시작하여 OnResume ()로 실행됩니다.

그것을 피하고 로딩을 두 번 수행하지 않도록하는 방법이 있습니까? 예를 들어, 이상적으로는 OnCreate조차도 발사 의도의 일부 속성에 따라 풍경이나 초상화 여부에 관계없이 활동이 알 수 있지만, 불가능한 것을 놓치지 않는 한. 나는 함께 로딩을 반복하지 않는 방법을 함께 해킹 할 수있었습니다. boolean 시간이 많이 걸리는 로딩 단계 전에는 올바른 방법처럼 보이지 않습니다. 나는 내가 무시할 수 있다고 생각한다 onSaveInstanceState, 그러나 그것은 많은 추가 코딩이 필요합니다. 이 작업을 수행하는 간단한 방법이 있습니까?

감사!


해결책:

다니엘의 대답에 따라, 이것은 실제로 해결하기가 매우 쉬웠습니다. 몇 가지 작은 변경을해야했습니다. 플레이어가 플레이 할 레벨을 선택할 수있는 '메뉴'활동에서는 IF/ELSE를 추가하여 내 의도에 따라 어떤 클래스를 시작할 것인지 선택해야했습니다. 이것은 플레이어가 레벨을 선택할 때 결정된 초상화 또는 풍경을 나타내는 간단한 INT로 수행되었습니다. 그런 다음 'gamelogic'클래스를 확장하는 두 번째 클래스를 만들었습니다. 이것은 메뉴, 지침 등보다 게임 자체의 대부분의 코드를 포함하는 클래스입니다.

public class GameLandscape extends GameLogic{
}

말 그대로 간단하고 완전히 비어 있습니다. 이렇게하면 방향에 따라 이미 물건을 다르게 처리하도록 이미 코딩 한 이전 활동의 모든 코드를 상속했습니다. 마지막으로, 나는 단지 게임 랜드 스케이프가 항상 풍경에서 실행될 것이라는 매니페스트에 줄을 추가해야했으며 Gamelogic은 항상 초상화로 실행될 것입니다.

그래서 실제로 간단한 문제입니다.

도움이 되었습니까?

해결책

하나는 초상화 레벨, 다른 하나는 조경 수준에 대한 두 가지 활동을 할 수 있습니다. 그런 다음 AndroidManifest.xml에서 활동의 방향을 설정합니다. android:screenOrientation 기인하다. 상속을 사용하는 경우 코드를 복제 할 필요조차 없습니다. 현재 활동을 기본 활동으로 사용하고 그 활동의 하위 클래스로 풍경/초상화 활동을 만듭니다.

더 나은 솔루션은이 두 가지의 올바른 활동을 열려는 의도가 될 것이라고 생각하지만, 의도 추가 분석을 통해 모든 것을 라우팅해야한다면 모든 수준을 의도를 분석하는 것 이상으로 모든 수준으로 전달할 수 있습니다. 그런 다음 적절한 활동으로 전달하십시오.

다른 팁

당신은 또한 무시할 수 있습니다 onRetainNonConfigurationInstance(). 이를 통해 전화를 통해 검색 할 수있는 하나의 항목을 일시적으로 저장할 수 있습니다. getLastNonConfigurationInstance(). 그렇게하면 필요한 모든 것을로드 할 수 있습니다. onRetainNonConfigurationInstance() 메소드 모든 것을 데이터 구조로 저장하고 반환 할 수 있습니다. 당신의 onCreate() 전화해도됩니다 getLastNonConfigurationInstance() 그리고 그것이 널 하중을 반환하면 모든 물건을로드하고 무언가를 반환하면 모든 것을로드해야합니다. 다음은 빠른 예입니다.

public class MyActivity extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        DataStructure myData = (DataStructure)getLastNonConfigurationInstance();
        if(myData == null)
        {
            // Load everything in
        }
        else
        {
            // Unpack myData
        }
    }

    @Override
    public Object onRetainNonConfigurationInstance()
    {
        DataStructure myData = new DataStructure();
        // Put everything in to myData
        return myData;
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top