Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 活动片段通信:混乱_Android_Android Fragments - Fatal编程技术网

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更容易维护代码。