如何从片段本身替换活动的片段?

bvi*_*iyg 53 android android-fragments

我的应用程序在其Activity中有一个Fragment.我想以编程方式从当前片段本身替换另一个片段.

例如,如果我单击片段内的按钮,则片段应替换为另一个片段,但活动应保持不变.

可能吗?如果是这样,怎么办?

Anu*_*kur 54

来自官方文档:

// 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();
Run Code Online (Sandbox Code Playgroud)

在此示例中,newFragment替换当前在R.id.fragment_containerID 标识的布局容器中的任何片段(如果有).通过调用addToBackStack(),替换的片段被保存到后栈,因此用户可以通过按Back按钮来反转事务并恢复前一个片段.

您描述的行为正是要设计的片段.请仔细阅读官方指南,以便彻底了解碎片,这将清除您的所有问题.

http://developer.android.com/guide/components/fragments.html

  • 这段代码应该放在哪里?在包含片段或片段的活动中? (2认同)

alo*_*rma 47

实际上很容易调用活动来替换片段.

你需要强制转换getActivity():

((MyActivity) getActivity())
Run Code Online (Sandbox Code Playgroud)

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

((MyActivity) getActivity()).replaceFragments(Object... params);
Run Code Online (Sandbox Code Playgroud)

当然,这假设您在活动中有一个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();
}
Run Code Online (Sandbox Code Playgroud)

  • replaceFragments的代码可以是:`public void replaceFragments(Class fragmentClass){``Fragment fragment = null;``try {``fragment =(Fragment)fragmentClass.newInstance();``} catch(Exception e){` `e.printStackTrace();``}``//通过替换任何现有的片段插入片段``FragmentManager fragmentManager = getSupportFragmentManager();``fragmentManager.beginTransaction().replace(R.id.flContent,fragment). commit();``}` (3认同)
  • @ silva96此评论是否可以添加到原始答案中,以便更容易阅读?:) 谢谢. (2认同)

Mar*_*ski 26

请注意,片段应该不是直接取代自己或任何其他碎片.片段应该是单独的实体.应该做什么片段来通知其父活动已发生某些事件.但,这一次,不是一个片段工作,以决定如何处理呢!它应该是决定即在手机上替换片段的活动,但是要在平板电脑上添加另一个片段.所以你基本上是在设计上做错了.

并且,正如其他人已经提到的,您的活动应该使用FragmentManager("本机"或兼容库)来完成工作(如replace()add()remove()):

http://developer.android.com/guide/components/fragments.html