android-fragments 如何从片段本身替换Activity的片段?

vh0rcniy  于 2022-11-14  发布在  Android
关注(0)|答案(8)|浏览(271)

我的应用程序在其Activity中有一个片段。我希望以编程方式将该片段替换为当前片段本身中的另一个片段。
例如,如果我单击片段内的按钮,该片段应该被替换为另一个片段,但Activity应该保持不变。
有可能吗?如果有,怎么做?

kuhbmx9i

kuhbmx9i1#

实际上,调用Activity来替换片段很容易。
您需要强制转换getActivity():

((MyActivity) getActivity())

然后,您可以从MyActivity调用方法,例如:

((MyActivity) getActivity()).replaceFragments(Object... params);

当然,这假设您在Activity中有一个replaceFragments()方法,用于处理片段替换过程。

编辑:@ismailarilik在此代码中添加了可能的replaceFragments代码,下面的第一个注解是由@silva96编写的:

replaceFragments的代码可以是:

public void replaceFragments(Class fragmentClass) {
    Fragment fragment = null;
    try {
        fragment = (Fragment) fragmentClass.newInstance();
    } catch (Exception e) {
        e.printStackTrace();
    }
    // Insert the fragment by replacing any existing fragment
    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.flContent, fragment)
            .commit();
}
a5g8bdjr

a5g8bdjr2#

官方文件:

// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);

// Commit the transaction
transaction.commit();

在此示例中,newFragment将替换当前位于由R.id.fragment_container ID标识的布局容器中的任何片段(如果有)。通过调用addToBackStack(),将替换的片段保存到返回堆栈,以便用户可以反转事务,并通过按Back按钮返回上一个片段。
你所描述的行为正是碎片的设计目的。请阅读官方指南,彻底了解碎片,这将澄清你所有的问题。
http://developer.android.com/guide/components/fragments.html

j91ykkif

j91ykkif3#

请注意,片段应直接替换其自身或任何其他片段。片段应是单独的实体。片段应做的是通知其父Activity发生了某个事件。但它是决定如何处理该事件的片段作业!它应是Activity来决定(即替换电话上的片段),而是在平板电脑上为现有的添加另一个。所以你基本上是在设计上做错了什么。
而且,正如其他人已经提到的,您的Activity应该使用FragmentManager(“native”或来自兼容性库)来完成这项工作(如replace()add()remove()):
http://developer.android.com/guide/components/fragments.html

ztigrdn8

ztigrdn84#

正如Marcin所说,你不应该让一个fragment启动另一个fragment或activity。处理这种情况的一个更好的方法是为主activity创建一个回调实现,以处理启动新fragment等请求。以下是android开发者指南中的一个很好的例子。

8aqjt8rx

8aqjt8rx5#

有一种方法是可行的;只需(在片段中)执行以下操作:

getFragmentManager().beginTransaction()
.add(R.id. container_of_this_frag, new MyNewFragment())
.remove(this)
.commit();
7fyelxc5

7fyelxc56#

当使用嵌套片段时,我们不希望每个内部片段的替换都转到最外部的Activity。允许片段通知其父片段它想更改为另一个片段的机制可能会很有用。
这是我用Kotlin编写的代码,我认为很容易翻译成java。

interface FragmentNavigator {
    fun navigateTo(fragment: Fragment)
}

class NavigableFragment: Fragment() {
    var navigator: FragmentNavigator? = null
    override fun onDetach() {
        super.onDetach()
        navigator = null
    }
}

内部片段需要扩展NavigableFragment,并使用以下代码将其自身更改为另一个片段。

navigator?.navigateTo(anotherFragment)

外部活动或片段需要实现FragmentNavigator,并覆盖navigateTo

override fun navigateTo(fragment: Fragment) {
    supportFragmentManager.beginTransaction().replace(view_id, fragment).commit()
}

//Use childFragmentManager instead of supportFragmentManager a fragment

最后在外层活动或片段中,覆盖onAttachFragment

override fun onAttachFragment(fragment: Fragment?) {
    super.onAttachFragment(fragment)
    if(fragment is NavigableFragment) {
        fragment.navigator = this
    }
}
chhkpiq4

chhkpiq47#

这对我很有效:

getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                    new MenuFragment()).commit();
pkwftd7m

pkwftd7m8#

为了Kotlin

(activity as YourActivityLauncherFragment)
                .supportFragmentManager.beginTransaction()
                .replace(R.id.yourFragmentContainer, YourFragmentName()).setReorderingAllowed(true)
                .commit()

相关问题