从ViewPager中的子片段通知他的父事件

时间:2014-09-21 17:06:56

标签: android android-fragments

我在一个活动中有一个片段,这个片段包含一个viewpager,这是代码:

public class RepliesContainerFragment extends Fragment {

    @InjectView(R.id.viewPager)
    ViewPager pager;
    private PagerAdapter adapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ReplyActivity replyActivity = (ReplyActivity) getActivity();
        List<Replie> replies = getArguments().getParcelableArrayList("replies");
        adapter = new PagerAdapter(replyActivity.getSupportFragmentManager(), replies);
        setActionBar();
    }

    private void setActionBar() {
        getActivity().getActionBar().setDisplayHomeAsUpEnabled(false);
        getActivity().getActionBar().setIcon(getResources().getDrawable(R.drawable.ic_back));
        getActivity().getActionBar().setDisplayHomeAsUpEnabled(true);
        getActivity().getActionBar().setTitle("Respuestas");
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        View view = inflater.inflate(R.layout.work_containter_replies, container, false);
        ButterKnife.inject(this, view);
        pager.setAdapter(adapter);
        return view;
    }
}

在适配器内部,我实例化了一些像这样的片段:

public class ReplyFragment extends Fragment {

    @InjectView(R.id.tvQuestion)
    TextView tvQuestion;
    @InjectView(R.id.frameContainter)
    FrameLayout replyContainer;
    private ReplyView replyView;
    private String question;
    private String currentReplie;
    private int replieType;
    private int questionId;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        replieType = getArguments().getInt("replyType");
        question = getArguments().getString("question");
        questionId = getArguments().getInt("questionId");
        currentReplie = getArguments().getString("currentReplie");
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        View view = inflater.inflate(R.layout.work_reply_fragment, container, false);
        ButterKnife.inject(this, view);
        initQuestionText();
        return view;
    }

    private void persistReply() {
        ReplyActivity replyActivity = (ReplyActivity) getActivity();
        if (replyActivity != null) {
            //DO SOMETHING
            //Notify to adapter from here
            }
        }
    }
}

正如你所看到的,我想通知我的RepliesContainerFragment和他的内部适配器发生了一些事件并做了一个动作..

我怎么能这样做? 有广播接收者,有回调(接口)......?我不确定。

2 个答案:

答案 0 :(得分:1)

这个非常简单的解决方案是将侦听器实例从父片段传递给子片段。您必须创建一个侦听器接口,在父片段中创建它的实例,并将该实例传递给所有子片段。

顺便说一下,官方教程中有关于此问题的topic

希望这有帮助。

答案 1 :(得分:0)

我认为这更容易:

 private void persistReply() {
        ReplyActivity replyActivity = (ReplyActivity) getActivity();
        if (replyActivity != null) {
            //DO SOMETHING
             RepliesContainerFragment frag = ((RepliesContainerFragment)this.getParentFragment());
             frag.getAdapter().notifyDataSetChanged(); 
            }
        }
 }

并为adapter

制作getter setter