2014-01-20 96 views
6

我有一个包含多个片段的活动。活动最初有片段,并有两个按钮。点击这个按钮后,我必须用新的片段替换片段。每个片段都有各种小部件,并将当前片段替换为各种事件。如何替换片段上的按钮点击片段?

这是我的问题。我怎样才能做到这一点。

建议我的想法。

+0

为什么你不能只改变片段的可见性? –

+1

将回调传递给活动并让它替换片段。为此,只需使用回调创建接口并在Activity中实现它。然后在片段覆盖onAttach(activity)函数并存储onClick的接口 – Androider

回答

12

你可以用FragmentTransaction替换片段。

你在这里。

制作接口。

public interface FragmentChangeListener 
{ 
    public void replaceFragment(Fragment fragment); 
} 

使用此界面实现您的Fragment控制活动。

public class HomeScreen extends FragmentActivity implements 
     FragmentChangeListener { 


     @Override 
     public void replaceFragment(Fragment fragment) { 
      FragmentManager fragmentManager = getSupportFragmentManager();;  
      FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
      fragmentTransaction.replace(mContainerId, fragment, fragment.toString()); 
      fragmentTransaction.addToBackStack(fragment.toString()); 
      fragmentTransaction.commit(); 
    } 

} 

从这样的片段调用此方法。

//在你的片段中。

public void showOtherFragment() 
{ 
     Fragment fr=new NewDisplayingFragment(); 
      FragmentChangeListener fc=(FragmentChangeListener)getActivity(); 
      fc.replaceFragment(fr); 
} 

希望这会起作用!

注意:mContainerId是持有碎片的视图的ID。 你应该重写Fragment的onString()方法。

+1

问题是如何从包含片段中调用活动中的方法,而不是什么方法应该看起来像 –

+0

@MarioStoilov:对不起,我已经更新了我的答案,请尝试一下。 –

+0

@Rashid:尝试我更新的答案。 –

1
  1. 定义一个接口并调用它IChangeListener(或类似的东西),并定义一个方法中,将做的工作(例如,changeFragment())(或称这将做的工作的另一种方法),用于改变片段) 。
  2. 让你的活动实现接口,或者在活动中创建一个匿名类来实现它。
  3. 制作片段的参数化构造函数,它接受IChangeListener参数。
  4. 初始化片段时,传递IChangeListener实现(匿名类或活动,实现它)
  5. 使按钮的onClick侦听器调用IChangeListener的更改方法。
+0

我知道这是推荐的方法。但是,你能告诉我使用它的优点吗?只需调用getActivity()。fragment中onClick的changeFragment()方法? – Srikanth

+0

@Srikanth如果你调用getActivity(),你会得到一个Activity类型的对象(基类,而不是你的实现),你将不得不将它转换为你的活动实现,这使你依赖于这个特定的实现,而当你使用接口时,实现它的类可能是一切(片段中的片段,列表视图中的片段等),并且不会打扰您,因此您可以将此代码用于不同的目的 –

+0

看起来很清洁并可以以这种方式重用。感谢澄清。我想你需要稍微更新一下你的答案。当你使用片段的参数化构造函数时,eclipse会抛出警告 - http://stackoverflow.com/questions/12062946/why-do-i-want-to-avoid-non-default-constructors-in-fragments。 Android建议使用onAttach(Activity),如此处所述 - http://developer.android.com/training/basics/fragments/communicating.html – Srikanth

1

良好,即使IM学习的Android ..

我解决了同样的问题,最近 “如何更改片段在按钮的单击事件”

`buttonNAme.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      FragmentTransaction fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction(); 
      fragmentTransaction.replace(R.id.frame1,new Homefragment()); 
      fragmentTransaction.commit(); 
     } 
    });` 

这里的“帧1”是“的FrameLayout”的id,这将已经在我的DrawerLayer的XML中定义了。

所以现在每当我想要片段事务我使用此代码。每次它将替换您最后一个片段的frame1。

FragmentTransaction fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction(); fragmentTransaction.replace(R.id.frame1,new newfragment()); fragmentTransaction.commit()

希望这将有助于..

1

从未来2017年后,存在触发使用总线活动不同的库,现在你可以用它来告诉活性当事件触发是因为它拥有一个片段。

参考:

RxBus with RxJava

您可以检查由谷歌提出的新架构

ViewModel

不要在接受答案的方法,获得超过真难看来自片段的3个不同事件