如何在按钮单击该片段时替换片段?

时间:2014-01-20 07:53:10

标签: android android-fragments android-activity

我有一个包含多个片段的活动。 Activity最初有片段,里面有两个按钮。单击此按钮后,我必须用新片段替换片段。每个片段都有各种小部件,并将当前片段替换为各种事件。

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

建议我的想法。

6 个答案:

答案 0 :(得分:16)

你可以用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 :(得分:4)

即使我正在学习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();
        }
    });`

这里“frame1”是我在DrawerLayer的XML中定义的“FRAMELAYOUT”的id。

所以现在每当我想要片段事务时,我都会使用这个代码。每次它都会替换你最后一个片段的frame1。

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

希望这会有所帮助..

答案 2 :(得分:2)

您可以使用以下命令替换片段上的片段:

getFragmentManager().beginTransaction().replace(R.id.main_content, new insertFragmentNameHere()).addToBackStack(null).commit();

答案 3 :(得分:1)

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

答案 4 :(得分:1)

从2017年及以后的未来,存在使用 Bus 触发事件的不同库,现在您可以使用它来告诉活动何时触发事件它拥有的片段。

参考:

RxBus with RxJava

您可以查看Google建议的新架构

ViewModel

不要在接受的答案中使用这种方法,从片段

中获得超过3种不同的事件会变得非常难看

答案 5 :(得分:0)

您可以尝试使用此代码,该代码对我来说效果很好,可以放大布局以查看,定义按钮并单击,

Button btn_unstable;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_home,container,false);

    btn_unstable = (Button)view.findViewById(R.id.btn_unstable);
    btn_unstable.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
    getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.fragment_replace, new UnstableFragment()).commit();

        }
    });
    return view;
}