【问题标题】:Incorrect screen height after setRequestedOrientationsetRequestedOrientation 后屏幕高度不正确
【发布时间】:2018-06-26 07:45:45
【问题描述】:

我正试图强制我的布局为平板电脑的横向,所以我有这个代码:

activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

但如果我在此调用后立即调用 getResources().getDisplayMetrics().widthPixels,它会返回平板电脑的高度而不是宽度。只有在调用 onConfigurationChanged 之后,我才开始获得正确的高度,这发生在我的主布局使用不正确的屏幕尺寸膨胀之后。

我在 setRequestedOrientation 之后尝试这样做:

DisplayMetrics dm = getResources().getDisplayMetrics();
int height = dm.heightPixels;
int width = dm.widthPixels;
dm.heightPixels = width;
dm.widthPixels = height;
getResources().updateConfiguration(getResources().getConfiguration(), dm);

但这并没有帮助。

处理这种情况的正确方法是什么?

P。 S. 即使我将方向设置为 SCREEN_ORIENTATION_LANDSCAPE,但在发生更改后我仍然会收到 SCREEN_ORIENTATION_USER。这是为什么呢?

【问题讨论】:

  • 你要实际屏幕尺寸还是UI屏幕尺寸?
  • 我认为显示指标返回 UI 屏幕大小,没有导航栏和返回按钮,所以这是我更喜欢的

标签: android android-layout


【解决方案1】:

问题是您的代码在设置布局之前计算宽度和高度。有一个叫做 ViewTreeObserver 的东西,它只允许你在布局设置后进行计算。

示例代码

final LinearLayout layout = (LinearLayout) findViewById(R.id.YOUR_VIEW_ID);
ViewTreeObserver vto = layout.getViewTreeObserver(); 
vto.addOnGlobalLayoutListener (new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() {
        layout.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
        int width  = layout.getMeasuredWidth();
        int height = layout.getMeasuredHeight(); 

    } 
});

【讨论】:

  • 我想获取可用于布局的屏幕高度,而不是布局的高度。它已经可用,只是稍微切换了高度和宽度。
  • 好的屏幕高度可以由 DisplayMetrics displayMetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); int height = displayMetrics.heightPixels; int width = displayMetrics.widthPixels;
  • 把宽高部分倒过来就可以知道横向
  • 这就是我已经在做的事情,但这似乎是一个 hack,因为一旦调用 onConfigurationChanged,宽度和高度就会发生变化
【解决方案2】:

您是否在清单的活动标签中添加了android:configChanges="keyboardHidden|orientation|screenSize"?如果没有,请添加并重试

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    相关资源
    最近更新 更多