Android:在片段之间跳跃的正确方式

Android:在片段之间跳跃的正确方式,android,design-patterns,android-fragments,Android,Design Patterns,Android Fragments,这是一个设计问题,而不是技术问题 一般情况:我希望片段中的UI事件能够在整个活动范围内进行更改 特定案例:我有两个片段,托管在同一活动中。当用户单击其中一个片段中的按钮时,我希望它被另一个片段替换 我不想,但是,我的片段会触动我的活动。我可能希望稍后更改行为(可能在更大的屏幕中,显示两个片段,而不是替换第一个片段),我不希望我的片段代码具有这种逻辑 我所做的是在片段中实现一个侦听器类,它将事件报告回活动。这样,如果我想使用另一个具有不同显示行为的活动类,我只需更改侦听器并保持片段代码不变 这是个

这是一个设计问题,而不是技术问题

一般情况:我希望片段中的UI事件能够在整个活动范围内进行更改

特定案例:我有两个片段,托管在同一活动中。当用户单击其中一个片段中的按钮时,我希望它被另一个片段替换

不想,但是,我的片段会触动我的活动。我可能希望稍后更改行为(可能在更大的屏幕中,显示两个片段,而不是替换第一个片段),我不希望我的片段代码具有这种逻辑

我所做的是在片段中实现一个
侦听器
类,它将事件报告回
活动
。这样,如果我想使用另一个具有不同显示行为的
活动
类,我只需更改侦听器并保持
片段
代码不变


这是个好办法吗?是否有标准的良好实践或更好的设计模式?

关于使用侦听器,您说得对。这也是我在工作项目中必须处理的事情。处理它的最好方法是使碎片在自然界中独立。任何希望与片段交互的东西都应该使用其公共API和/或为特定事件设置侦听器。如果您熟悉,这是最新的。事件可以是一般的或特定的,也可以包含数据或不包含数据

作为我项目的一个例子,我有两个片段。显示所选ListItem的ListFragment和InfoFragment。ListFragment已经为我的活动提供了一个监听器接口,但是InfoFragment没有,因为它是您的基本片段。我在InfoFragment中添加了一个监听器接口,当片段想要关闭时会收到通知。对于片段,这可以通过按下按钮或执行特定操作来实现,但就我的活动而言,当事件被触发时,它将关闭片段视图


不要害怕为片段使用大量侦听器,还要尝试使用数据参数按特定操作对其进行分组,以使其个性化。希望这有帮助

建议使用侦听器在片段和活动之间进行通信

有关信息,请参见此。长话短说,它们只是通过Activity类实现了一个监听器接口,并将getActivity()结果转换为一个片段到监听器

根据我个人的经验,这非常方便,因为您可以:

  • 轻松切换底层活动(例如,在3.0之前的版本中,为了兼容性,您在包装器活动中托管整个片段,并在11+中托管此片段和其他片段)
  • 轻松控制包装器活动是否支持回调。只需检查它是否实现了侦听器,如果没有,则执行应用程序特定的操作

  • 以下问题的技术答案:

    我有两个片段,托管在同一个活动中。当用户单击其中一个片段中的按钮时,我希望它被另一个片段替换


    我遇到了类似的问题。我有一个FragmentActivity,它通过tabhost 4 listfragments进行管理,每个listfragments都可以根据用户交互启动其他片段(所有片段共享其内容显示的相同布局)。回调模式仍然有效吗?谢谢,回调模式非常适合这种情况。让活动通过侦听所有片段来完成启动
        FragmentTransaction ft = this.getFragmentManager().beginTransaction();
        Fragment mFragment = Fragment.instantiate(this.Activity(), Fragment2.class.getName());
        ft.replace(android.R.id.content, mFragment);
        ft.commit();
    
    public class Example_3_Mainfile extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);        
             setContentView(R.layout.example_3_mainfile);
    
                     Fragment fr ;//make class that extend to thefragment 
                     fr = new Act_2_1();                 
                         FragmentManager fm = getFragmentManager();
                         FragmentTransaction fragmentTransaction = fm.beginTransaction();
                         fragmentTransaction.replace(R.id.fragment_place, fr);
                        //id get of fragment tag  from xml file there decelar
                         fragmentTransaction.commit();
                         }
        }