我有一个应用,可以在清单上强制执行肖像:

<activity
            android:name=".MyActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:screenOrientation="portrait"
            android:label="@string/launcher_name"
            android:launchMode="singleTop"
            android:windowSoftInputMode="adjustPan">

</activity>


我确实会在某些情况下使用以下方法手动进行景观设计:

 private fun triggerPortrait() {
        [email protected] = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
    }

    private fun triggerLandscape() {
        [email protected] = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
    }


现在,我希望某些元素在方向为横向时更改其大小,因此我有这两个dimens.xml

dimens-land.xml

<resources>
    <dimen name="scoreboard_height">24dp</dimen>
</resources>


dimens-port.xml

<resources>

    <dimen name="scoreboard_height">16dp</dimen>
</resources>


但是,彼此之间的切换根本不起作用,仅使用了景观。我想这与我强制执行肖像有关,但是有办法解决吗?

android - 景观尺寸被忽略-LMLPHP

android - 景观尺寸被忽略-LMLPHP

android - 景观尺寸被忽略-LMLPHP

最佳答案

您可以从清单条目的android:configChanges="orientation"中删除​​MyActivity。但是由于这是不希望的,并且声明具有此属性的配置将阻止活动重新启动,因此,该活动将保持运行状态,并调用其onConfigurationChanged()方法,并且您应注意配置更改并应用您所需要的逻辑而是改为覆盖onConfigurationChanged()

因此,这是手动完成操作的方法,

将这些dimen值复制到一个全局可用的values / dimens.xml文件中

values / dimens.xml

<resources>
    <dimen name="scoreboard_height_land">24dp</dimen>
    <dimen name="scoreboard_height_port">16dp</dimen>
</resources>


更新方向变暗以通过其键指向这些值(以防万一您在应用程序中重复使用这些值而没有所有这些逻辑并且这些区域不中断的情况)

values-land / dimens.xml

<resources>
    <dimen name="scoreboard_height">@dimen/scoreboard_height_land</dimen>
</resources>


values-port / dimens.xml

<resources>
    <dimen name="scoreboard_height">@dimen/scoreboard_height_port</dimen>
</resources>


覆盖onConfigurationChanged设置记分板的新高度

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

public void setHeightOfScoreboardViewBasedOnOrientation(int orientation) {

    // change the id to match what you have in your xml (since i dont know it at the time of writing this)
    View myScoreboardView = findViewById(R.id.myScoreboardView);

    // get the layout params and set a new height, then set it back n the view
    ViewGroup.LayoutParams myScoreboardViewLayoutParams = myScoreboardView.getLayoutParams();
    if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
        myScoreboardViewLayoutParams.height = getResources().getDimensionPixelSize(R.dimen.scoreboard_height_land);
    } else if (orientation == Configuration.ORIENTATION_PORTRAIT) {
        myScoreboardViewLayoutParams.height = getResources().getDimensionPixelSize(R.dimen.scoreboard_height_port);
    }
    myScoreboardView.setLayoutParams(myScoreboardViewLayoutParams);

}


注意:
您可能使用setHeightOfScoreboardViewBasedOnOrientationtriggerPortraittriggerLandscapeConfiguration.ORIENTATION_PORTRAIT方法调用Configuration.ORIENTATION_LANDSCAPE方法。但是处理configChanges更有趣,特别是当您的活动在后台并且方向发生变化时!

关于android - 景观尺寸被忽略,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48343547/

10-08 21:08