使 OrientationEventListener 中的函数仅在未单击按钮时才起作用

问题描述 投票:0回答:1

我的活动的 onCreate 中有一个 OrientationEventListener,如果用户旋转他的手机,它会执行一个操作。我还有一个按钮,如果单击该按钮,则无需用户手动旋转即可旋转屏幕布局。问题是,当我单击按钮时,onCreate 中的侦听器也会被激活,因为当屏幕旋转时活动会再次启动,但我需要仅在移动设备本身旋转时才发生操作,而不是通过单击。

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContentView(R.layout.activity_main)
        val button = findViewById<ImageButton>(R.id.button)
        button.setOnClickListener(object : View.OnClickListener {
            override fun onClick(v: View) {
                //call function that rotates the screen for example:
                  setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            }
        })

        val sharedPref = getSharedPreferences("string", MODE_PRIVATE)
        val orientationListener: OrientationEventListener = object : OrientationEventListener(
            applicationContext
        ) {
            override fun onOrientationChanged(orientation: Int) {
                   //call function that needs to work only if the user rotates the phone without clicking the button
            }
        }
        if (orientationListener.canDetectOrientation()) {
            orientationListener.enable();
        }

    }

我尝试使用布尔值来指示按钮是否被单击,但是每次旋转发生时,无论是手动还是通过单击,活动都会被销毁并重新启动,因此布尔值被重置并调用 onCreate/OrientationEventListener 。有什么建议吗?

P.S.:OrientationEventListener 并不是这个问题的焦点,而是当识别到移动设备旋转时我需要在其中发生的操作。因此,如果您有其他方法可以做到这一点,我也想听听。轮换后重新开始的活动也不是我需要的,但每次轮换发生时都会发生这种情况,我不知道是否可以阻止它。

android kotlin android-studio
1个回答
0
投票

您可以将以下配置添加到清单文件中,以在发生配置更改(例如屏幕旋转)时停止重新创建 Activity。 将以下内容添加到清单文件中 MainActivity 的标签中:

android:configChanges="orientation|screenSize"

这将防止在方向改变时重新创建活动。

下一步:在 MainActivity 中,重写 onConfigurationChanged() 方法来处理方向更改,而无需重新创建 Activity:

override fun onConfigurationChanged(newConfig: Configuration) {
        super.onConfigurationChanged(newConfig)
        isButtonClicked = false // Reset flag after handling programmatic rotation
        // Handle orientation changes here, e.g., update layout if needed
    }

您可以在此处重置 isButtonClicked 布尔值,以了解屏幕方向是否因按钮单击或手动旋转而改变。

最后在 onCreate() 方法中,您可以在触发方向更改之前将 isButtonClicked 布尔值设置为 tru,并在侦听器内检查它的值,以跳过仅在手动旋转发生时才运行的代码。

val button = findViewById<ImageButton>(R.id.button)
        button.setOnClickListener {
            isButtonClicked = true
            // Call function that rotates the screen, e.g.,
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
        }

        val orientationListener = object : OrientationEventListener(this) {
            override fun onOrientationChanged(orientation: Int) {
                if (!isButtonClicked) {
                    // Call function that needs to work only for manual rotation
                    // ... your action here ...
                }
            }
        }
© www.soinside.com 2019 - 2024. All rights reserved.