如何在属于活动的按钮上从Fragment设置clickListener?

时间:2016-07-18 15:45:07

标签: android event-handling

我的应用程序结构只是一个Activity,一次显示一个Fragment。活动的布局由xml文件定义,其中它呈现FloatingActionButton。片段应拦截按钮上的点击事件,但永远不会调用onClick()

活动xml布局:

...

<android.support.design.widget.FloatingActionButton
   android:id="@+id/fab"
   android:visibility="visible"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"/>

...

片段类:

    ...

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
        adapterCity = new AdapterCity(getContext(), 0, Main.cities);
        setListAdapter(adapterCity);
        colorAccent = getContext().getResources().getColor(R.color.colorAccent);
        fab = (FloatingActionButton) getActivity().findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                openMap();
            }
        });
        fab.setImageDrawable(getResources().getDrawable(R.drawable.ic_bubble_chart_black_24dp));
    }

    ...

来自活动的UI事件似乎没有传播到attacched片段。这里发生了什么?我怎样才能解决我的问题?

1 个答案:

答案 0 :(得分:1)

不是一个好习惯。片段不应该直接了解托管活动,也不应该从它们访问视图。这可以通过让您的活动实现一个自定义接口来实现,其中包含一些方法,例如myMethod(),然后调用getActivity()并将其类型化为接口并调用方法,如下所示:

((MyInterface)getActivity()).myMethod();

现在针对您的具体情况,我建议您传递某种变量,这些变量在每个片段中都会有所不同,并且基于您在myMethod()的{​​{1}}实现中设置不同onClickListeners的变量到你的FloatingActionButton