在片段内监听活动按钮的点击事件

6
我刚开始学习有关Fragment的知识,我有一个活动,它有1000多行的代码,我已经将它转换成了一个片段。
我想知道是否有一种简单的方法让我的片段可以监听其父活动XML中存在的按钮。我尝试在片段的onCreateView中添加一个具有按钮ID的常规侦听器,但是它(预期)给了我一个null指针异常。
我确实知道使用OnSearchClickListener方法可以做到这一点,但从我所知道的用法来看,可能需要花费大量时间进行手动重构才能达到我需要的效果(至少如此)。因此,我想知道是否有其他方法以非重复的方式完成这项工作。

实现用于活动和片段之间通信的接口。参考:http://simpledeveloper.com/how-to-communicate-between-fragments-and-activities/ - nnn
您可以使用接口来实现此功能。让您的Fragment实现该接口并重写接口方法以执行所需的功能。 - Bhargav
4个回答

6
你可以通过以下方法在Activity中获取视图的引用:
View view = getActivity().findViewById(R.id.view_in_activity);

接下来添加监听器:

view.setOnClickListener(new OnClickListener() {
    void onClick(View v) {
        // Perform some action
    }
})

这是我问题的正确答案,尽管我从其他答案中了解到了其他形式的活动-片段通信(接口)(谢谢大家)。 - Zuhayr
如何在Xamarin上实现? - Daniel Reyhanian

4
在 Fragment 中,应该像这样做...
public class Myfragment extends Fragment {

    public interface Callback {
        public void onButtonClicked(View radiobtn);
    }

    private Callback callback;

    @Override
    public void onAttach(Activity ac) {
        super.onAttach(ac);
        callback = (Callback) ac;
    }

    @Override
    public void onDetach() {
        callback = null;
        super.onDetach();
    }

    radiobtn.setOnClickListener(new OnClickListener() {
        public void onClick(View view) {
            if (callback != null) {
                callback.onButtonClicked(view);
            }
        }
    });
}

在Activity中,可以像这样操作...
public class Myfragment extends Activity implements MyFragment.Callback{

    public void onButtonClicked(View btn) {
        // The radiobutton in MyFragment has been clicked
        myButton.setEnabled(true); // or something like this.
    }
}

1
这是一个关于如何从Activity获取点击事件到Fragment而不是从Fragment到Activity的问题。 - user17778563

3

定义一个名为ClickListenerOnActivity的接口,其中包含一个名为onClickInActivity(View v)的方法,并在片段中实现该接口。在活动中点击按钮时调用此接口的方法。

您可以查看此示例以了解如何实现接口。


2
尽管Emre Akturk的答案并没有错,但这不是最佳实践,因此您可能会将Fragment附加到另一个Activity,而该Activity可能没有该View。因此,最好的方法是使用一个interface。让您的Fragment实现所需的接口,然后在ButtononClickListener中调用该Fragment的接口即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接