繁体   English   中英

替换交易后如何保持片段状态?

[英]How to keep fragment state after replace transaction?

我在 Android 应用程序中有两个片段(假设FragmentAFragmentB ),我在使用BottomBar之间切换。

我有一个被提取使用改造,我使用FragmentA一个RecyclerView显示数据的列表,我有一个FragmentB MapView类

我的问题是每当我从FragmentB切换回FragmentA 时API 调用都会再次获取数据列表 当我从FragmentA切换到FragmentB 时,MapView 从头开始​​再次呈现。

有没有办法可以保持 FragmentA 的状态,即数据列表,直到我销毁活动? 并将 MapView 保留在 FragmentB 中?

我使用以下内容替换了一个片段。

public void replaceFragment(Fragment fragment // This can be FragmentA or FragmentB) {
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.framelayout, fragment);
        transaction.commit();
    }

我只想碎片以保持它们的状态,并且在活动被销毁之前不要重新初始化所有东西。 我猜片段的生命周期方法在这里起着重要的作用。

任何帮助表示赞赏。 谢谢!

架构组件更适合您的场景。 使用LiveDataViewModel

  1. 在 Activity 中,创建一个视图模型并使用服务器响应更新实时数据。

  2. 在 Fragment 中,使用实时数据更新视图。

在这种情况下,ViewModel 生命周期附加到 Activity 并且片段事务不会影响存储的数据。 由于您正在更新 LiveData 中的数据,因此在创建活动时只会进行一次 api 调用。 除此之外,ViewModel 在方向更改后仍然存在,这意味着您的 LiveData 仍然保留 API 响应。

在 MyActivity 中,在 onCreate 上方声明两个片段对象:

private Fragment1 fragment1 = new Fragment1();
private Fragment2 fragment1 = new Fragment2();

单击BottomBar,您可以设置单击显示和隐藏两个片段。

设置片段 1 被选中

private void fragment1Selected() {
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        if (fragment1 == null || !fragment1.isAdded()) {
            fragment1 = new Fragment1();
            transaction.add(R.id.framelayout, fragment1);
        } else {
            transaction.show(fragment1);
        }

        if (fragment2 != null)
            transaction.hide(fragment2);

        transaction.commit();
    }

设置片段 2 被选中

private void fragment2Selected() {
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        if (fragment2 == null || !fragment2.isAdded()) {
            fragment2 = new Fragment2();
            transaction.add(R.id.framelayout, fragment2);
        } else {
            transaction.show(fragment2);
        }

        if (fragment1 != null)
            transaction.hide(fragment1);

        transaction.commit();
    }

以 Rumit Patel 的回答为基础

我创建了一个函数来显示第一个片段

private fun initialFragment(fragment: Fragment) {
    val fragmentTransaction = supportFragmentManager.beginTransaction()
    fragmentTransaction.replace(R.id.frameLayoutMA,fragment)
    fragmentTransaction.commit()
}

然后对于每个后续片段,我将前一个片段(我想隐藏的片段)与新片段(我想显示的片段)一起传递给这个函数

private fun fragmentSelected(oldFragment: Fragment, newFragment: Fragment) {
    val fragmentTransaction = supportFragmentManager.beginTransaction()

    fragmentTransaction.hide(oldFragment)

    if (!newFragment.isAdded) {
        fragmentTransaction.add(R.id.frameLayoutMA, newFragment)
    }

    else {
        fragmentTransaction.show(newFragment)
    }

    fragmentTransaction.commit()
}

如果要隐藏多个片段,则可以创建一个 arrayList 并添加除要显示的片段之外的所有片段

fun fragmentArrayList(exception: Int): ArrayList<Fragment> {

    val fragmentList: ArrayList<Fragment> = ArrayList()

    if (exception != fragment1) {
        fragmentList.add(fragment1)
    }

    if (exception != fragment2 {
        fragmentList.add(fragment2)
    }

    if (exception != fragment3 {
        fragmentList.add(fragment3)
    }

    if (exception != fragment4 {
        fragmentList.add(fragment4)
    }

    return fragmentList
}

并使用第二个函数的此变体隐藏除新片段之外的所有片段

    private fun fragmentSelected(oldFragments: ArrayList<Fragment>, newFragment: Fragment) {
    val fragmentTransaction = supportFragmentManager.beginTransaction()

    for (oldFragment in oldFragments) {
        fragmentTransaction.hide(oldFragment)
    }

    if (!newFragment.isAdded) {
        fragmentTransaction.add(R.id.frameLayoutMA, newFragment)
    }

    else {
        fragmentTransaction.show(newFragment)
    }

    fragmentTransaction.commit()
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM