2

가로 모드 용 세로 모드 용 레이아웃이 두 ​​개 있습니다. 세로의 경우 레이아웃 폴더 아래에 있고 풍경의 경우 레이아웃 랜드 폴더 아래에 있습니다. 둘 다 main.xml이라는 이름을 가지고 있습니다. 전환이 세로에서 가로 방향으로 오류없이 발생합니다. 다시 풍경에서 세로로 전환 할 때 어떤 이유에서든 세로 기반 레이아웃을로드하지 않고 정의한 루트 레이아웃을 찾을 수 없습니다. 여기가로 모드에서 세로 모드로 레이아웃을 전환 할 때의 문제

07-27 15:25:09.601: WARN/System.err(278): java.lang.ClassCastException: android.widget.LinearLayout 
07-27 15:25:10.230: WARN/System.err(278):  at com.me2youmob.swagwrap.ChickenWrapActivity.loadMBIIntoView(ChickenWrapActivity.java:102) 
07-27 15:25:10.230: WARN/System.err(278):  at com.me2youmob.swagwrap.ChickenWrapActivity.onCreate(ChickenWrapActivity.java:41) 
07-27 15:25:10.230: WARN/System.err(278):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
07-27 15:25:10.250: WARN/System.err(278):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 
07-27 15:25:10.250: WARN/System.err(278):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
07-27 15:25:10.250: WARN/System.err(278):  at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3815) 
07-27 15:25:10.311: WARN/System.err(278):  at android.app.ActivityThread.access$2400(ActivityThread.java:125) 
07-27 15:25:10.311: WARN/System.err(278):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2037) 
07-27 15:25:10.311: WARN/System.err(278):  at android.os.Handler.dispatchMessage(Handler.java:99) 
07-27 15:25:10.322: WARN/System.err(278):  at android.os.Looper.loop(Looper.java:123) 
07-27 15:25:10.322: WARN/System.err(278):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
07-27 15:25:10.329: WARN/System.err(278):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-27 15:25:10.329: WARN/System.err(278):  at java.lang.reflect.Method.invoke(Method.java:521) 
07-27 15:25:10.361: WARN/System.err(278):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
07-27 15:25:10.361: WARN/System.err(278):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
07-27 15:25:10.371: WARN/System.err(278):  at dalvik.system.NativeStart.main(Native Method) 

거기 코드 그 \ 로그 캣 출력이다

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main);   
    int deviceRotation = getWindowManager().getDefaultDisplay().getRotation(); 
    Utils.spPreferences = getSharedPreferences(Utils.PREFS_NAME, 0); 
    if (deviceRotation == 1) 
    { 
     int imgID = Utils.getMbiIndex("mbiIndex"); 
     int drawBgId = Utils.getMbiDrawIndex(imgID); 
     try 
     { 
      ImageView ivLandView = (ImageView) findViewById(R.id.ivLandMbi); 
      ivLandView.setImageResource(drawBgId); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     }     
    } 
    else 
    { 
     loadMBIIntoView(); 
     handleButtonClicks(); 
    } 
} 

코드

public void loadMBIIntoView() 
{ 
    int imgID = Utils.getMbiIndex("mbiIndex"); 
    int drawBgId = Utils.getMbiDrawIndex(imgID); 
    try { 
     RelativeLayout llMain = (RelativeLayout) findViewById(R.id.rlMain); 
     Resources res = getResources(); 
     Drawable drawMbi = res.getDrawable(drawBgId); 
     llMain.setBackgroundDrawable(drawMbi);   
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

가로 레이아웃 다음됨에 따라 loadMBIIntoView 방법 happenson 오류를 다음에서 onCreate이다에서 rlMain 레이아웃 자체가 없지만 초상화가 않습니다. 액티비티가 다시 시작될 경우 (나에게 괜찮은) 스크린 모드를 변경할 때마다 적절한 레이아웃을 자동으로로드하지 않아야합니까? 나는 이것에 대한 도움을 주시면 감사하겠습니다. 고맙습니다.

는 UPDATE : 오후 2시

나는 코드 있지만 여전히 줄 같은 오류를 추가했다. 선형 레이아웃을 상대 레이아웃으로 캐스팅하기 때문에 오류가 발생합니다. 여기가 문제의 위치입니다. 세로 레이아웃 ("main.xml")은 기본 "레이아웃"폴더에 있습니다. 이 레이아웃에는 상대 레이아웃 ("rlmain")이 있습니다. 랜드 스케이프 레이아웃 ("main.xml")은 layout-land 폴더에 있습니다. 이 main.xml에는 UI 사양이 다르며 선형 레이아웃이 있습니다. 기본적으로 세로 모드로로드합니다. 가로로로드하면 Ctrl + F11을 눌러 가로로 변경하면 레이아웃 랜드 폴더의 레이아웃이 잘로드됩니다. 그런 다음 Ctrl + F11을 다시 눌러 세로 레이아웃으로 변경합니다. 여기서 기본 레이아웃 폴더의 main.xml이로드되어 있어야하지만로드되지 않아 케이스 예외가 발생합니다.

+0

랜드 스케이프 파일에 rlMain이 없습니까? 안드로이드는 레이아웃과 레이아웃 랜드의 레이아웃을 자동으로 전환하지만 거기에없는 레이아웃은 생성하지 않습니다. rlMain이 가로 파일에 없으면 findViewById (R.id.rlMain)는 null을 반환하고 사용하려고하면 오류가 발생합니다. – theisenp

+0

예 landscape 파일에 rlMain이 없습니다. 가로 모드가 활성화 될 때 rlMain이 호출되지 않도록 제한 조건을 적용했습니다. 세로 레이아웃을로드해야 할 때 세로 모드로 다시 전환 할 때 오류가 발생하고 rlMain을 찾을 수 있어야합니다. – vikramjb

+0

알았어. ChickenWrapActivity의 102 행에 뭐가 들어 있니? – theisenp

답변

1

LinearLayout을 RelativeLayout으로 캐스팅하려고하는 것처럼 보이지만 원래 세로 모드에서 작동하기 때문에별로 의미가 없습니다. 그래도 onCreate()에서 if 문에 문제가있을 수 있습니다. loadMBIIntoView() 함수가 호출되어서는 안될 때 호출되어 오류가 발생할 수 있습니다.

deviceRotation == 1을 테스트하지만 장치가 90도 회전 한 경우에만 270도 회전하는 경우는 무시합니다. 아무것도 변경하는 경우

대신을 시도하고 참조 :

if(deviceRotation == Surface.ROTATION_90 || deviceRotation == Surface.ROTATION_270) 
{ 
    ... 
} 
else 
{ 
    ... 
} 

Surface.ROTATION_90는 미리 정의 된 1에 해당하는 정수 및 Surface.ROTATION_270 3.

편집과 같다 :

여전히 deviceRotation에 문제가 있다고 생각합니다. Ctrl + F11은 "이전 레이아웃 방향"으로 이동하고 Ctrl + F12는 here과 같이 "다음 레이아웃 방향"으로 이동합니다. 따라서 F11 키를 두 번 누르면 원본 방향으로 돌아 가지 않습니다. 거꾸로 세로 모드로 전환 중입니다.

에뮬레이터가 실제로 원래 상태로 돌아가고 여전히 오류가 발생하는지 확인하려면 F11 키를 누른 다음 F12 키를 두 번 눌러보십시오.

편집 # 2 :

이 에뮬레이터 회전에 문제가 (possibly a bug) 것으로 보인다. 비슷한 질문은 here입니다.

기본적으로 에뮬레이터는 실제 장치에서 사용하지 않는 추가 수명주기 호출을 만듭니다. 아마 실제 장치처럼 가속도계 대신에 opening the keyboard으로 회전을 시뮬레이션합니다.

가능한 경우 실제 장치에서 코드를 테스트하여 합법적 인 문제인지 확인합니다. 지금은 에뮬레이터에 문제가있는 것 같아 무시해야합니다.

+0

모든 것을 입력 할 수 없어서 원래 게시물에 업데이트를 추가했습니다.레이아웃 캐스팅에 대한 귀하의 생각은 정확합니다. 문제는 잘못된 레이아웃이 세로 모드로로드되고 있으며 그 이유는 어떻게되는지 잘 모르겠습니다. – vikramjb

+0

내 원래 답변을 업데이트했습니다. – theisenp

+0

그게 효과 :) 고마워. Ctrl + F12를 누르면 작동합니다.하지만 기기에서 거꾸로 뒤집어지면 레이아웃이 충돌합니다. – vikramjb

0

나는 또한 동일한 문제에 직면했다. 해결 됐어. 기본 문제는 가로에서 세로로 전환 할 때 활동이 상쾌하지 않다는 것입니다. 한 가지 작업을 수행하고 onConfigurationChanged를 재정의하고 이와 같이 구현할 수 있습니다. 활동을 새로 고침합니다.

public void onConfigurationChanged(Configuration newConfig) { 
    // TODO Auto-generated method stub 
    super.onConfigurationChanged(newConfig); 
    startActivity(getIntent()); 
    finish(); 

} 

도움이 될 것입니다. 문제가 해결되면 회신 해주십시오.

0

AndroidManifest.xml 행을 방향을 지정하려는 활동에 추가하십시오.

안드로이드 : configChanges = "오리엔테이션 | keyboardHidden | 화면 크기"코드가 방향 변경에 대한 이러한 라인을 사용

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

또한

된 setContentView (R.layout.main)로서> < "된 setContentView"후 방향을 설정하는 데에 유의; setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

관련 문제