要向您的托管Activity
传达内容,Android Docs建议让您的Activity
实施某个界面,并将其投放到Fragment
中的该界面:
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnArticleSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");
}
}
但是,如果您的Activity
是许多Fragment
的主持人,那么您的Activity
声明将如下所示:
public class MainActivity extends Activity implements ListenerA, ListenerB, ListenerC /* etcetera */
当然,这对可读性,模块化等没有帮助,更不用说只是在Activity
的主体本身填充所有已实现的方法。
有没有更好的方法来实现这一目标?
如果我没记错的话,建议不要手动将听众设置为Fragment
,尽管我找不到相应的来源。
答案 0 :(得分:1)
你可以通过两种方式实现我能想到的沟通,但是我可能会做一些不好的做法,所以要用一点点盐就可以了!
第一种方法是使用getActivity()来获取对更新它的activity方法的引用。你只需要注意片段活动引用当前是否为空。
第二种是使用广播来通知活动某些内容已经发生变化,并使用广播接收器根据收到的广播执行不同的操作。 (似乎有点矫枉过正)。
答案 1 :(得分:0)
我建议的一种方法是使用EventBus: EventBus允许组件之间的发布 - 订阅式通信,而不需要组件明确地相互注册
其他方法是创建自定义片段并使其抽象并添加抽象侦听器方法..如下所示
public abstract class CustomFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View row = inflater.inflate(R.layout.activity_main, container, false);
row.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onFragmentClick();
}
});
return row;
}
public abstract void onFragmentClick();
}
当您创建自定义片段的实例时,请将侦听器方法实现为..
CustomFragment customFragment = new CustomFragment() {
@Override
public void onFragmentClick() {
}
};
答案 2 :(得分:0)
一个可能的解决方案是复制某些android组件的样式,例如onClickListener,它具有onClick(View v)方法,并且不考虑为该活动监听多少个视图,它委托给选择当前活动的活动。
例如:
public interface onSomethingHappenedInFragmentListener{
public void onSomethingHappened(Fragment f);
}
在您的活动中:
myFragment1.setOnSomethingHappenedInFragmentListener(this);
myFragment2.setOnSomethingHappenedInFragmentListener(this);
myFragment3.setOnSomethingHappenedInFragmentListener(this);
myFragment4.setOnSomethingHappenedInFragmentListener(this);
并在您的活动中实施onSomethingHappened
:
public void onSomethingHappened(Fragment f){
switch(f.getID()){
myFragment1.getID():
myFragment2.getID():
myFragment3.getID():
myFragment4.getID():
...
}
}
然后在您的活动中,您可以检查哪个片段已更改。
有了这个你可以有N个片段只有一个监听器,请注意接口是一个例子,在实际情况下你可能需要在方法参数中添加一些额外的信息