这是一个devise问题,而不是技术问题。
一般情况下 :我想要一个片段中的UI事件进行整个活动的变化。
具体案例 :我有两个片段,在同一活动中托pipe。 当用户点击其中一个片段的button时,我希望它被另一个replace。
但是,我不想要我的碎片触及我的行为。 我可能想稍后改变行为(也许,在一个更大的屏幕上,显示这两个片段,而不是replace第一个),我不希望我的片段代码具有该逻辑。
我所做的是在我的片段中实现一个Listener
类,它将事件报告给Activity
。 这样,如果我想要使用另一个具有不同显示行为的Activity
类,则只需更改侦听器并保持Fragment
代码不变。
这是一个好方法吗? 有没有一个标准的良好做法,或更好的devise模式?
使用监听器是Fragment与您的活动之间沟通的推荐方式。
有关信息,请参阅此Android文档部分 。 长话短说,他们只是通过Activity类实现一个监听器接口,并将getActivity()结果转换为一个监听器的片段。
从我个人的经验来看,这非常方便,因为您可以:
你对使用Listener是正确的。 这是我在工作中还必须处理的一个项目。 处理这个问题的最好办法就是让碎片本身独立。 任何希望与Fragment进行交互的人都应该使用其公共API和/或为特定事件设置监听器。 如果您熟悉Design Patterns ,那么这就是Observer模式 。 事件可以是一般的或特定的,也可以包含数据或不包含数据。
作为我的项目的例子,我有两个片段。 一个ListFragment和一个显示所选ListItem的InfoFragment。 ListFragment已经有一个Listener接口供我的Activity挂钩,但是InfoFragment并没有包含你的基本片段。 我向InfoFragment添加了一个Listener接口,当Fragment想要closures的时候会收到通知。 对于片段,这可以通过按下button或发生特定的操作,但就我的活动而言,当触发事件时,会closures片段视图。
不要害怕为碎片使用大量的监听器,而且还要通过使用数据参数的特定操作对它们进行分组,以使它们个性化。 希望这可以帮助!
技术答案为:
我有两个片段,主持在同一个活动。 当用户点击其中一个片段的button时,我希望它被另一个replace。
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(); } }