Как применить изменения ориентации экрана если configChanges="orientation"?

Есть активити для которого в манифесте указаны такие параметры

...
<application>
...
        <activity
            android:name=".MyActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:exported="true">

        </activity>
...
    </application>
...

то есть по сути фрагменты сидящие в этом активити не пересоздается при повороте экрана, а используется существующий.

Проблема с на данный момент в том, что для разной ориентации экрана должны быть применены разные значения для Guideline, то есть у меня значения для sw-600dp и для sw-600dp-land разные и проблема в том, что из за того, что при повороте экрана UI не пересоздается в данном фрагменте, то при повороте экрана значения не меняются.

Вопрос, есть ли какой то способ обновить UI если configChanges="orientation указан для активити?

P.S. Я понимаю, что можно удалить этот параметр из манифеста, но тогда прийдется рефакторить много кода который уже работает так.


Ответы (1 шт):

Автор решения: Sirop4ik

В итоге я сделал это таким образом

class MyFragment() {
...
    private val leftDynamicGuideLinePercentageOffset: Float
        get() {
            val outValue = TypedValue()
            resources.getValue(R.dimen.guideline_left, outValue, true)
            return outValue.float
        }

    private val rightDynamicGuideLinePercentageOffset: Float
        get() {
            val outValue = TypedValue()
            resources.getValue(R.dimen.guideline_right, outValue, true)
            return outValue.float
        }

    //Since this fragment related to the activity which is block UI recreate on config change, it is necessary to support it programmatically.
    private fun setLeftDynamicGuideLineOffset(percentage: Float) {
        val guideLine: Guideline = requireView().findViewById(R.id.verticalGuidelineLeft)
        val params: ConstraintLayout.LayoutParams = guideLine.layoutParams as ConstraintLayout.LayoutParams
        params.guidePercent = percentage
        guideLine.layoutParams = params
    }

    //Since this fragment related to the activity which is block UI recreate on config change, it is necessary to support it programmatically.
    private fun setRightDynamicGuideLineOffset(percentage: Float) {
        val guideLine: Guideline = requireView().findViewById(R.id.verticalGuidelineRight)
        val params: ConstraintLayout.LayoutParams = guideLine.layoutParams as ConstraintLayout.LayoutParams
        params.guidePercent = percentage
        guideLine.layoutParams = params
    }

    override fun onConfigurationChanged(newConfig: Configuration) {
        super.onConfigurationChanged(newConfig)

        setLeftDynamicGuideLineOffset(percentage = leftDynamicGuideLinePercentageOffset)
        setRightDynamicGuideLineOffset(percentage = rightDynamicGuideLinePercentageOffset)
    }
...
→ Ссылка