Android:在片段之间跳转的正确方法

时间:2011-09-06 15:47:07

标签: android design-patterns android-fragments

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

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

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

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

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

这是一个很好的方法吗?是否有标准的良好做法或更好的设计模式?

4 个答案:

答案 0 :(得分:12)

使用侦听器是Fragment与您的活动之间进行通信的推荐方式。

有关信息,请参阅此Android documentatin section。简而言之,它们只是通过Activity类实现一个侦听器接口,并将一个片段中的getActivity()结果转换为一个侦听器。

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

  1. Easilly切换基础活动(例如,您将整个片段托管在包装器活动中以实现3.0之前的兼容性,并将此片段与11 +中的其他片段一起托管)
  2. 如果包装器活动支持回调,则轻松控制。只需检查它是否实现了侦听器,如果没有,则执行特定于应用程序的操作。

答案 1 :(得分:2)

你正确地使用了一个监听器。这也是我在工作项目中必须处理的问题。处理它的最佳方法是使Fragment在本质上独立。任何希望与Fragment交互的内容都应使用其公共API和/或为特定事件设置侦听器。如果您熟悉Design Patterns,那就是Observer pattern。事件可以是一般的或特定的,也可以包含数据或没有数据。

作为我项目的一个例子,我有两个碎片。 ListFragment和显示所选ListItem的InfoFragment。 ListFragment已经有一个Listener接口供我的Activity挂钩,但是InfoFragment不是你的基本片段。我在InfoFragment中添加了一个Listener接口,当Fragment想关闭时会通知它。对于片段,可以通过按下按钮或发生特定操作,但就我的活动而言,当触发事件时,它将关闭片段视图。

不要害怕使用大量的片段侦听器,而是尝试使用数据参数通过特定操作对它们进行分组以使其个性化。希望这有帮助!

答案 2 :(得分:0)

技术答案:

  

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

    FragmentTransaction ft = this.getFragmentManager().beginTransaction();
    Fragment mFragment = Fragment.instantiate(this.Activity(), Fragment2.class.getName());
    ft.replace(android.R.id.content, mFragment);
    ft.commit();

答案 3 :(得分:0)

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