2

風景用のポートレート用に2つのレイアウトがあります。似顔絵の場合はレイアウトフォルダの下にあり、風景の場合はレイアウトランドフォルダの下にあります。どちらも同じ名前のmain.xmlを持ちます。肖像画から風景へのいかなる誤りもなくスイッチングが起こる。私がランドスケープからポートレートに切り替えるとき、何らかの理由でポートレートベースのレイアウトをロードせず、私が定義したルートレイアウトを見つけることができません。ここでLogcat出力はレイアウトをポートレートモードからランドスケープモードに切り替えるときの問題

@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にありますコードがある

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) 

\ですrlMainレイアウト自体はありませんが、ポートレートはありません。私が画面モードを変更するたびに、アクティビティが再開されていれば(自動的に適切なレイアウトを読み込まないでください)私はこれについて何か助けていただければ幸いです。ありがとうございました。

UPDATE:二時PM

私は、コードを追加しましたが、そのはまだ同じエラーを与えます。リニアレイアウトを相対レイアウトにキャストするためにエラーが発生します。これが問題の原因です。ポートレートレイアウト( "main.xml")はデフォルトの "layout"フォルダにあります。このレイアウトには相対レイアウト( "rlmain")があります。ランドスケープレイアウト( "main.xml")はlayout-landフォルダにあります。このmain.xmlは異なるUI仕様を持ち、線形レイアウトを持っています。デフォルトでは、ポートレートモードでロードし、Ctrl + F11を押してLandscapeに変更すると、layout-landフォルダのレイアウトが正常に読み込まれます。次に、Ctrl + F11をもう一度押して、デフォルトのレイアウトフォルダのmain.xmlがロードされているがロードされていない場合に、ケース例外を取得する理由をPortraitに変更します。

+0

ランドスケープファイルにrlMainが含まれていませんか? Androidは自動的にレイアウトとレイアウトランドのレイアウトを切り替えますが、そこにないレイアウトは作成されません。 rlMainがランドスケープファイルにない場合、findViewById(R.id.rlMain)はnullを返し、使用しようとするとエラーが発生します。 – theisenp

+0

はい、ランドスケープファイルに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

EDIT等しい:

私はまだあなたのdeviceRotationには問題があると思います。 Ctrl + F11は「前のレイアウトの向き」に進み、Ctrl + F12は「次のレイアウトの向き」に移動します(here)。 F11を2回押すと、元の向きに戻らなくなります。あなたは逆さまのポートレートモードに切り替わります。

エミュレータが本当に元の状態に戻り、それでもエラーが発生するかどうかを確認するために、初めてF11キーを押し、次にF12キーを押してください。

EDIT#2:

これはエミュレータの回転に問題(possibly a bug)ように見えます。 これに似た質問がhereであることがわかります。

本質的に、エミュレータは実際のデバイスにはない余分なライフサイクルコールを行います。おそらく実際のデバイスと同じように、加速度計の代わりにopening the keyboardで回転をシミュレートします。

可能であれば、実際のデバイスでコードをテストして正当な問題であるかどうかを確認します。今はエミュレータの問題なので、無視してください。

+0

全体を入力することができず、元の投稿に更新が追加されました。レイアウトのキャストについてのあなたの考えは正しいですが、間違ったレイアウトがポートレートモードで読み込まれているのですが、その理由はわかりません。 – vikramjb

+0

私のオリジナルの答えが更新されました。 – theisenp

+0

それは働いた:)ありがとうトン。 Ctrl + F12を押すと機能しますが、デバイスが逆さまになっているときに電話でそのレイアウトがクラッシュすることはありますか? – vikramjb

0

私も同じ問題に直面しました。それは解決した。その主な問題は、風景から肖像画に切り替えるときです。活動は爽やかではありません。 1つのことを行い、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);

関連する問題