2017-09-13 106 views
0

我在我的應用程序中有兩個活動。Android中奇怪的屏幕旋轉行爲

當設備處於縱向位置並且設備轉向橫向顯示「摘要屏幕」時,將顯示主要活動活動(ShowAndTellActivity)已啓動。

該應用的這部分似乎能可靠地工作,並且與取得了以下:

@Override 
public void onConfigurationChanged (Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 

    int orientation=newConfig.orientation; 

    switch(orientation) { 

     case Configuration.ORIENTATION_LANDSCAPE: 

      show_and_tell_intent.setClass(getApplicationContext(),ShowAndTellActivity.class); 
      show_and_tell_intent.putExtra("each_pays", v_currency_symbol.concat(new DecimalFormat("0.00").format(v_each_to_pay))); 
      startActivity(show_and_tell_intent); 

      break; 

     case Configuration.ORIENTATION_PORTRAIT: 

      break; 

    } 
} 

摘要活動包含以下代碼以finish()當設備旋轉回到縱向位置的活動:

@Override 
public void onConfigurationChanged (Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 

    int orientation=newConfig.orientation; 

    switch(orientation) { 

     case Configuration.ORIENTATION_LANDSCAPE: 

      break; 

     case Configuration.ORIENTATION_PORTRAIT: 

      finish(); 
      break; 

     case Configuration.ORIENTATION_UNDEFINED: 

      finish(); 
      break; 

    } 
} 

但是,當設備首次旋轉回肖像時,摘要活動並未完成 - 相反,摘要屏幕以縱向顯示(看起來很糟糕)。

將設備旋轉回風景(摘要屏幕再次顯示「OK」)並再次返回肖像,結果摘要活動按預期完成。

從這個角度看,旋轉設備似乎可以在應用程序正確切換活動的情況下可靠地工作。換句話說,它只是第一次旋轉回肖像,似乎沒有觸發摘要活動的finish()

這幾乎就像彙總屏幕活動啓動時一樣,直到它改變了一次,它才知道它的方向。

+0

您可以鎖定活動以僅在清單中以單一方向顯示。我建議你這樣做。 –

+0

@Gabe鎖定清單中的方向將會阻止應用程序檢測到旋轉並因此阻止顯示摘要活動。這不是我正在尋找的。 –

+0

就我個人而言,我會考慮一個功能,當應用程序更改爲向我展示旋轉時完全不同的某個功能時,我討厭它。但是在那種情況下,你是否考慮將摘要作爲一個片段,並使用內置的旋轉顯示更改行爲來顯示帶有該片段的佈局而不是普通的佈局? –

回答

0

的唯一可靠方法我能找到實現,這是我自己寫的旋轉檢測處理程序:

myOrientationEventListener = new OrientationEventListener(this, SensorManager.SENSOR_DELAY_NORMAL){ 

     @Override 
     public void onOrientationChanged(int deviceAngle){ 
      if (deviceAngle >= 320 || deviceAngle <= 40) { 
       finish(); 
      } 
     } 
    }; 

在第二活動使用內置的onConfigurationChanged只是不可靠 - 在從風景到肖像的第一次旋轉中始終失敗。

0

我遇到過類似的問題。在我的情況下,onConfigurationChanged沒有被第一次調用。對我來說onRestoreInstanceState()工作

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) 
{ 
    super.onRestoreInstanceState(savedInstanceState); 
    if (savedInstanceState != null) 
    { 
     switch(getResources().getConfiguration().orientation) { 
      case Configuration.ORIENTATION_LANDSCAPE: 
       break; 

      case Configuration.ORIENTATION_PORTRAIT: 
       finish(); 
       break; 

      case Configuration.ORIENTATION_UNDEFINED: 
       finish(); 
       break; 
     } 

    } 
} 
+0

看來我有點快接受這個答案。它解決了我在Android Studio模擬器中描述的問題,但不是在我的HTC 10上,所以它似乎不是一個正確的解決方案....所以我仍然堅持這個錯誤。 –