活动片段沟通:混乱

时间:2014-03-25 18:52:46

标签: android android-fragments

要向您的托管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,尽管我找不到相应的来源。

3 个答案:

答案 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个片段只有一个监听器,请注意接口是一个例子,在实际情况下你可能需要在方法参数中添加一些额外的信息