Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用replace()后如何保存片段的实例状态?_Android_Android Fragments_Kotlin - Fatal编程技术网

Android 使用replace()后如何保存片段的实例状态?

Android 使用replace()后如何保存片段的实例状态?,android,android-fragments,kotlin,Android,Android Fragments,Kotlin,我的活动有3个子片段-一次只显示1个。我正在使用BottomNavigationView在子片段之间切换。当通过supportFragmentManager.beginTransaction().replace()创建活动时,显示的初始子片段GameFragment()会膨胀,它将替换my XML中的片段容器 首先,让我向您展示我进入活动的整个生命周期,在replace()上切换片段,然后在replace()上切换回初始片段。这些日志语句仅与活动和片段A相关(未显示片段B和C) .replace

我的活动有3个子片段-一次只显示1个。我正在使用BottomNavigationView在子片段之间切换。当通过
supportFragmentManager.beginTransaction().replace()
创建活动时,显示的初始子片段GameFragment()会膨胀,它将替换my XML中的片段容器

首先,让我向您展示我进入活动的整个生命周期,在
replace()
上切换片段,然后在
replace()
上切换回初始片段。这些日志语句仅与活动和片段A相关(未显示片段B和C)

.replace()
将片段A替换为片段B

onPause (Fragment A)
onStop (Fragment A)
.replace()
将片段B替换为片段A

onAttach (Fragment A)
onCreate (Fragment A)
onCreateView (Fragment A)
onActivityCreated (Fragment A)
为了在使用
replace()
切换片段时保留片段状态,我尝试了以下方法,但都失败了

  • onDestroyView()
    中更改片段中成员变量的值,然后在
    onActivityCreated()中访问它

  • 添加到
    onDestroyView()
    中的
    getArguments()
    ,并在
    onActivityCreated()
    中访问

  • 我还尝试在
    onPause()
    中更改变量
    truthisvisible
    ,并尝试在
    onCreateView()
    中接收变量,但变量从未更改为
    stringafter
    getArguments()
    也是如此-参数不会改变

    此外,所有这些方法中的
    savedInstanceState
    都是
    null
    。虽然我希望在替换片段时不会触发
    onSaveInstanceState()

    我在这里完全走不通了。调用
    replace()
    时,如何更改或保存片段中的变量?如果你好奇,下面是我的家长活动:

    var initialFragmentLoad = false
    
    class TruthOrDare : FragmentActivity(), BottomNavigationView.OnNavigationItemSelectedListener {
    
        override fun onNavigationItemSelected(item: MenuItem): Boolean {
            if (!initialFragmentLoad){
                return true
            }
            val selectedFragment = when (item.itemId){
                R.id.action_leaderboards -> LeaderboardsFragment()
                R.id.action_options -> OptionsFragment()
                else -> GameFragment()
            }
            Log.d("ChosenFragment", selectedFragment.toString())
            val transaction = supportFragmentManager.beginTransaction().replace(R.id.fragment_layout, selectedFragment)
            transaction.addToBackStack(null)
            transaction.commit()
            return true
        }
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_truth_or_dare)
            bottomNav_truthordare.setOnNavigationItemSelectedListener(this)
            bottomNav_truthordare.selectedItemId = R.id.action_game
            initialFragmentLoad = true
            if (savedInstanceState != null) {
                return
            }
            val firstFragment = GameFragment()
            firstFragment.arguments = intent.extras
            supportFragmentManager.beginTransaction().replace(R.id.fragment_layout, firstFragment).commit();
        }
    
    }
    

    我也想知道为什么我不能用上面的方法改变变量

    您可以使用处理程序类

    public static class GameHandler {
      public static string truthisvisible;
    }
    
    然后打电话

    Gamehandler.truthisvisible = "stringafter";
    val previousValue = Gamehandler.truthisvisible;
    

    您可以在
    onCreateView()
    中尝试阻止片段重新膨胀其视图,如下所示

     if (view != null) {
        ViewGroup parent = (ViewGroup) view.getParent();
        parent.removeView(view);
     } else {
        //here you put your current code from `onCreateView()`
     }
    

    view
    是否参考这里的
    getView()
    ?我现在已经在代码中添加了onCreateView-我不确定您的代码是否适合我的函数:在您的代码中
    View View=inflater.inflate()…
    ,然后
    返回视图
    Gamehandler.truthisvisible = "stringafter";
    val previousValue = Gamehandler.truthisvisible;
    
     if (view != null) {
        ViewGroup parent = (ViewGroup) view.getParent();
        parent.removeView(view);
     } else {
        //here you put your current code from `onCreateView()`
     }