Android 活动片段通信:混乱
要将内容传达给宿主Android 活动片段通信:混乱,android,android-fragments,Android,Android Fragments,要将内容传达给宿主活动,建议让你的活动实现一些接口,并将其投射到你的片段中的该接口: @Override public void onAttach(Activity activity) { super.onAttach(activity); try { mListener = (OnArticleSelectedListener) activity; } catch (ClassCastException e) { throw new Cl
活动
,建议让你的活动
实现一些接口,并将其投射到你的片段
中的该接口:
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnArticleSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");
}
}
但是,如果您的活动
是许多片段
的宿主,则您的活动
声明将类似于:
public class MainActivity extends Activity implements ListenerA, ListenerB, ListenerC /* etcetera */
当然,这无助于可读性、模块化等,更不用说仅仅将所有实现的方法填充到活动的主体中了
有没有更好的方法来实现这一点?
如果我没记错的话,建议不要手动将侦听器设置为片段,尽管我找不到这方面的来源。有两种方法可以实现沟通,我可以想到,但我认为这可能是一种不好的做法,所以请谨慎对待
第一种方法是使用getActivity()获取对更新它的activity方法的引用。您只需注意片段活动引用当前不是空的
第二种是使用广播通知活动某些内容已更改,并使用广播接收器根据接收到的广播执行不同的操作。(似乎有点过头了)。我建议的一种方法是使用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() {
}
};
一个可能的解决方案是复制一些Android组件的样式,例如OnCLICKISTENER,它具有OnCutter方法(View V),它不考虑有多少视图被用于该活动,它委托活动来选择当前的一个。p>
例如:
public interface onSomethingHappenedInFragmentListener{
public void onSomethingHappened(Fragment f);
}
在您的活动中:
myFragment1.setOnSomethingHappenedInFragmentListener(this);
myFragment2.setOnSomethingHappenedInFragmentListener(this);
myFragment3.setOnSomethingHappenedInFragmentListener(this);
myFragment4.setOnSomethingHappenedInFragmentListener(this);
在您的活动中,在某些事情上执行:
public void onSomethingHappened(Fragment f){
switch(f.getID()){
myFragment1.getID():
myFragment2.getID():
myFragment3.getID():
myFragment4.getID():
...
}
}
然后在你的活动中,你可以检查哪个片段已经改变了
有了这个,您可以有N个片段,只有一个侦听器,请注意,接口就是一个例子,在实际情况下,您可能需要向方法参数添加一些额外的信息我也想知道这一点;尽管我认为建议的方法(使用接口)没有问题。如果你有太多的实现,你最好重新设计应用程序,使其整洁。Fragment
s的整个思想是为你的应用程序创建可重用的模块化组件,使多个活动变得不必要(是吗?)。我见过这样的情况:接口的数量会增加到10-15个,导致活动非常混乱。第一个挑战了松散耦合的目的,即片段
不应该知道关于其主机的任何信息。第二种选择似乎有点过分,但值得商榷。使用LocalBroadcastManager
,开销并没有那么大。它似乎比原来的方法更健壮。这仍然会使您的活动
混乱不堪,可能有10+implements
子句及其方法。您将只实现一个接口。当然,您需要实现尽可能多的代码片段,这是知道如何处理每个片段的唯一方法。我错过了一般的界面部分。这可能是一个有趣的解决方案,但也很难弄清楚到底发生了什么。对不起,我的答案有点差,我已经对它进行了编辑以使其更清晰。谢谢,我将查看事件总线
。不过,我对抽象的片段不是很确定。好吧,我在以前的项目中使用了这两种方法。抽象片段比EventBus更容易维护代码。