这是一个设计问题,而不是技术问题。
一般情况:我希望片段中的UI事件能够进行活动范围的更改。
具体案例:我有两个片段,托管在同一个活动中。当用户单击其中一个片段中的按钮时,我希望它被另一个片段替换。
我不想要,但是,我的碎片触及了我的活动。我可能想稍后改变行为(也许,在更大的屏幕中,显示两个片段而不是替换第一个),我不希望我的片段代码具有该逻辑。
我所做的是在我的片段中实施一个Listener
类,将事件报告回Activity
。这样,如果我想使用具有不同显示行为的另一个Activity
类,我只需更改监听器并保持Fragment
代码不变。
这是一个很好的方法吗?是否有标准的良好做法或更好的设计模式?
答案 0 :(得分:12)
使用侦听器是Fragment与您的活动之间进行通信的推荐方式。
有关信息,请参阅此Android documentatin section。简而言之,它们只是通过Activity类实现一个侦听器接口,并将一个片段中的getActivity()结果转换为一个侦听器。
根据我的个人经验,这非常方便,因为您可以:
答案 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();
}
}