如何从片段本身replace活动的片段?

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

例如,如果我点击片段中的一个button,片段应该被replace为另一个,但是活动应该保持不变。

可能吗? 如果是的话,该怎么做呢?

调用活动来replace片段实际上很简单。

你需要强制getActivity():

((MyActivity) getActivity()) 

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

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

当然,这假定你的活动中有一个replaceFragments()方法来处理片段replace过程。

编辑: @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(); } 

从官方文档:

 // 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(); 

在这个例子中,newFragmentreplace了R.id.fragment_container ID标识的布局容器中的任何片段(如果有的话)。 通过调用addToBackStack() ,被replace的片段被保存到后退堆栈,以便用户可以通过按下“后退”button来反转事务并返回前一个片段。

你所描述的行为正是devise要做的事情。 请通过官方指南彻底了解碎片,这将清除所有的问题。

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

请注意,片段不应该直接replace自己或任何其他片段。 片段应该是独立的实体。 什么片段应该做的是通知其父母的活动,发生了一些事件。 但是,这又不是一个决定如何处理这个问题的片段工作! 它应该是活动,即决定即在手机上更换片段,而是在平板电脑上添加另一个片段。 所以你基本上是通过devise做错了。

而且,正如其他人已经提到的,你的活动应该使用FragmentManager(“native”或兼容库)来完成这个工作(如replace()add()remove() ):

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

正如马辛所说,你不应该有一个片段开始另一个片段或活动。 处理这种情况的更好的方法是为主要活动创build一个callback实现来处理请求,例如启动一个新的片段。 这是Android开发人员指南中的一个很好的例子。