首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android Dialog 旋轉屏幕佈局錯亂解決:分離橫豎屏佈局或鎖定配置變更

     編輯:程式設計綜合問答

現象:拍照預覽 Dialog 在橫豎屏切換時只顯示一半,按鈕區域丟失。代碼在 onConfigurationChanged 中 dismiss() 後重建,但佈局未適配新方向。

根因:單一佈局無法適配雙向度

Dialog 使用固定 XML 佈局,旋轉後寬高互換,原佈局的 wrap_content、固定尺寸(如 240dp x 320dp)導致內容截斷。

方案一:提供橫豎屏專用佈局(推薦)

  • res/layout/img.xml(豎屏)
  • res/layout-land/img.xml(橫屏,調整 ImageView 尺寸、按鈕排列)

系統自動根據 Configuration.orientation 選擇佈局,**無需手動重建 Dialog**。

方案二:鎖定 Dialog 方向(簡單業務)

// Manifest 中對應 Activity
 // 強制豎屏

或代碼中:setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)。

方案三:動態計算尺寸(不想加佈局文件)

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    if (dialog != null && dialog.isShowing()) {
        // 重新計算寬高
        WindowManager.LayoutParams params = dialog.getWindow().getAttributes();
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        params.width = (int)(dm.widthPixels * 0.9);
        params.height = (int)(dm.heightPixels * 0.7);
        dialog.getWindow().setAttributes(params);
        // 若佈局結構需變,仍需重建
    }
}

最佳實踐清單

  1. 優先 **方案一**:符合 Android 資源適配機制,零代碼處理旋轉。
  2. Dialog 佈局使用 ConstraintLayout + guideline 實現響應式。
  3. 避免在 onConfigurationChanged 中手動 dismiss/show,易導致閃爍、狀態丟失。
  4. 全螢幕 Dialog 考慮 DialogFragment + setStyle(STYLE_NORMAL, R.style.FullScreenDialog)。
  5. 善用資源限定符,讓系統自動處理配置變更,代碼更簡潔健壯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved