2

我有兩個佈局,一個用於橫向肖像。對於縱向我有它在佈局文件夾和景觀下我有它在layout-land文件夾下。兩者都具有相同的名稱main.xml。切換從縱向到橫向沒有任何錯誤發生。同樣,當我從橫向切換到縱向時,出於某種原因,它不加載基於縱向的佈局,無法找到我定義的根佈局。下面是logcat的輸出\將佈局從縱向切換到橫向模式時出現問題

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) 

這是存在的代碼中的onCreate是如下

@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(); 
    } 
} 

happenson其中代碼如下

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方法的錯誤沒有rlMain佈局本身,但肖像確實。如果活動正在重新啓動(這對我來說很好),每當我更改屏幕模式時,不應該自動加載適當的佈局?我將不勝感激任何幫助。謝謝。

更新:02:00 PM

我加入了代碼,但它還是給了同樣的錯誤。由於將線性佈局轉換爲相對佈局而導致錯誤消失,這就是問題所在。縱向佈局(「main.xml」)位於其默認的「佈局」文件夾中。該佈局具有相對佈局(「rlmain」)。橫向佈局(「main.xml」)駐留在layout-land文件夾中。這個main.xml具有不同的UI規範,並具有線性佈局。默認情況下,我在縱向模式下加載它加載正常,我按下Ctrl + F11將其更改爲橫向,layout-land文件夾中的佈局加載正常。然後我再次按下Ctrl + F11以更改爲縱向,其中默認佈局文件夾中的main.xml應該已加載,但未加載,這就是爲什麼我得到案例異常。

+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

編輯:

我仍然認爲這是你的deviceRotation的一個問題。 Ctrl + F11轉到「上一個佈局方向」,而Ctrl + F12轉到here所述的「下一個佈局方向」。所以當你按F11兩次,你不會回到原來的方向。您正在切換到倒置的人像模式。

嘗試按F11的第一時間,然後F12第二次,使模擬器確實返回到它是真實的原始狀態,看看是否仍然會導致錯誤。

EDIT#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」 後設置方向>爲

的setContentView(R.layout.main); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

相關問題