簡體   English   中英

Android Activity 娛樂前台 ViewPager2 布局測量

[英]Android Activity recreation front ViewPager2 layout measurements

我的活動在其布局中包含 ViewPager2。

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="ru.telemonitor.signal.r2d2.multimeter.imsat.Fragments.Dialogs.CalibrateActivity">

    ...

    <LinearLayout
        android:id="@+id/ll"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintTop_toBottomOf="@+id/calibrate_result"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent">

        <androidx.viewpager2.widget.ViewPager2
            android:id="@+id/calibrate_steps_pager"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:layout_gravity="center"
            android:layout_margin="10dp"
            />

        <com.google.android.material.tabs.TabLayout
            android:id="@+id/calibrate_steps_tab_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center"
            app:tabBackground="@drawable/tab_indicator_selector"
            app:tabGravity="center"
            app:tabIndicatorHeight="0dp"
            />


    </LinearLayout>
    

</androidx.constraintlayout.widget.ConstraintLayout>

這就是 ViewPager2 初始化的方式。 請注意,CalibrateProbesFragment 的高度與其他高度不同。

private inner class CalibrateActivityPagerAdapter(fa: FragmentActivity) : FragmentStateAdapter(fa) {
        override fun getItemCount(): Int = 4

        override fun createFragment(position: Int): Fragment {
            return when (position) {
                0 -> CalibrateProbesFragment()
                1 -> CalibrateVoltageFragment()
                2 -> CalibrateCurrentFragment()
                3 -> CalibrateResistanceFragment()
                else -> Fragment()
            }
        }
    }

當活動由 Intent 創建時,會有正確的高度測量。

在此處輸入圖片說明 在此處輸入圖片說明

之后,我嘗試在通過 startActivityForResult 調用其他活動后在其 onActivityResult 方法中重新創建活動。

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        val unmaskedRequestCode = requestCode and 0x0000ffff

        if (unmaskedRequestCode == ImsatActivity.PICK_DEVICE_REQUEST) {
            if (resultCode == RESULT_OK) {
                data?.let { data ->

                    val index = data.getIntExtra(DiscoverActivity.DEVICE_INDEX, -1)
                    if (index < 0) {
                        super.onBackPressed()
                        return
                    }

                    val available = AppController.getInstance().dataProviderService.discoveredDevices
                    if (available.size == 0) {
                        Toast.makeText(this, "Error: try reconnect", Toast.LENGTH_LONG).show()
                        super.onBackPressed()
                        return
                    }

                    if (available.size < index) {
                        super.onBackPressed()
                        return
                    }

                    val multimeterDevice = available[index]
                    val name = data.getStringExtra(DiscoverActivity.DEVICE_NAME)
                    if (name == null || name == "" || name != multimeterDevice.name) {
                        super.onBackPressed()
                        return
                    }

                    AppController.getInstance().dataProviderService.tryConnectDevice(multimeterDevice)

                    viewPager.setCurrentItem(0, false)
                    restart()
                }
            }
        }
        }

    private fun restart () {
       // startActivity(Intent.makeRestartActivityTask(this.intent?.component))
        recreate()
    }

正如您所注意到的,我在 recreate() 之前調用了 viewPager.setCurrentItem(0, false)。 活動重置后,viewpager 中的所有片段與第一個片段具有相同的高度(在索引 0 處)。

在此處輸入圖片說明 在此處輸入圖片說明

我使用重新創建是因為我希望活動位於后退導航隊列中的同一點,但完全重新創建其視圖。 主要是因為這似乎是更少的代碼解決方案。 如果可以使用標准的 Activity 方法,我真的不想為自定義娛樂編寫 100 多行。 也許有一些解決方法? 謝謝你。

我不知道如何解決這個問題。 我剛剛通過 Intent 開始了一項新活動。

private fun restart () {
       // startActivity(Intent.makeRestartActivityTask(this.intent?.component))
//        recreate()
        val intent = Intent(this, CalibrateActivity::class.java)
        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_TASK_ON_HOME
        startActivity(intent)
        finish()
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM