【问题标题】:Rotate a fragment in devices with width 600dp and higher在宽度为 600dp 及更高的设备中旋转片段
【发布时间】:2020-09-20 06:31:04
【问题描述】:

我有一个应用程序,它的屏幕旋转被锁定在其中BaseActivity 是所有视图的父级,在清单中包含此代码:

android:configChanges="uiMode"

所以所有片段和活动都是垂直的,不能旋转。

我需要创建一个将绑定到此活动的片段,并且需要在宽度为 600dp 或更高的设备上旋转并以水平模式显示。当片段被破坏(或视图被破坏)时,事情需要按原样进行。活动和所有片段应垂直显示。

有没有办法做到这一点?

编辑 这是我在片段中添加的代码,但片段变得迟钝,最终显示黑屏。

override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        requireActivity().window.setSoftInputMode(SOFT_INPUT_ADJUST_PAN)
        return inflater.inflate(R.layout.my_fragment, container, false).apply {
            post {
                if (measuredWidth > 600) {
                    activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
                }
            }
        }
    }

    override fun onDestroyView() {
        activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
}

【问题讨论】:

  • 在您的片段 onCreate( ) 中,检查设备是否较大宽度。如果是,则处理方向更改。在您的片段中 onDestroy( ) 再次恢复您之前所做的方向更改。你试过这种方法吗?你能发布你的代码吗,让我们看看你尝试了什么。
  • 是的,我现在就发布代码。 @Rajasekhar
  • @Rajasekhar 刚刚添加了一个包含代码的编辑
  • 我已经添加了我的答案。请告诉我进展如何。

标签: android android-fragments android-activity


【解决方案1】:

如果我假设您使用的是NavigationComponent,您可以处理所有方向并检查活动本身的宽度。

我为常规设备和大型设备创建了布尔资源值。

values\bools.xml这是针对普通设备的

我们故意将此设置为 false,因为我们知道宽度很小

<resources>
    <bool name="isLarger">false</bool>
</resources>

values-sw600dp/bools.xml 这适用于较大的设备。您需要创建此文件。

我们将其设置为 true,因为我们知道现在宽度很大

<resources>
    <bool name="isLarger">true</bool>
</resources>

现在在您的活动或片段中,当您执行此检查调用此资源时,如果应用程序在移动设备中运行,它将返回 false。如果是平板电脑或更大的设备,它将返回 true。

使用NavigationComponentdestinationListener,您可以在这里处理所有事情。

       navController.addOnDestinationChangedListener { _, destination, _ ->

            when (destination.id) {
                R.id.firstFragment -> {
                    requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
                }

                R.id.secondFragment -> {
                    if (resources.getBoolean(R.bool.isLarger)) {
                        // Screen is larger, change orientation here
                    } else {
                        // Screen is smaller, perform your action
                    }
                }
            }
        }

如果您仍然没有使用NavigationComponent,您可以通过这种方式检查fragment onCreate()

class SecondFragment : Fragment() {

    private var mTwoPane = false

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        if (resources.getBoolean(R.bool.isLarger)) {
            mTwoPane = true;
        }

        if (mTwoPane) {
            Toast.makeText(context, "Larger", Toast.LENGTH_SHORT).show()
        } else {
            Toast.makeText(context, "Smaller", Toast.LENGTH_SHORT).show()
        }
    }
}

就是这样。

【讨论】:

  • 那么我应该在哪里检查mTwoPane 的值呢?在onCreate?
  • 在片段 onCreate() 中是。我在答案末尾添加了代码
  • if (mTwoPane) { Toast.makeText(context, "Larger", Toast.LENGTH_SHORT).show()。这很热,我们意识到它是小还是大。但是,屏幕仍然卡在旋转的中间。
  • 我已经在我的像素 3a 和像素平板模拟器中进行了测试。没有这样的滞后。
  • 你用过这样的代码吗:activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
猜你喜欢
  • 2016-05-15
  • 1970-01-01
  • 2011-07-10
  • 1970-01-01
  • 2017-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多