在自定义视图中调用片段方法

Calling a fragment method inside a custom view

因此,对于某些背景,我尝试在自定义视图中调用我的片段(托管自定义视图)中的方法。

我试过使用接口并在片段中实现它。我还尝试在自定义视图中获取片段的实例并以这种方式调用方法。无论出于何种原因,我都得到空指针。

方式#1

public SurveyView(Context context, AttributeSet attrs) {
    super(context, attrs);
    setOrientation(VERTICAL);
    options = new ArrayList<>();
    //updatePolls is the interface. 
    updatePolls = new MultipleChoicePollFragment();
}
public interface UpdatePolls {
    void update();
}

然后我在 onClickListener 中调用方法:

v.setOnClickListener(new OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            for (int p = 0; p < options.size(); p++) {
                                if (options.get(p) == v) {
                                    setAnswers(p);
                                    updatePolls.update();
                                }
                            }
                        }
                    });

在我的片段中调用了 update() 方法,我尝试显示祝酒词,但它 returns 带有空指针。

方法#2

在自定义视图的构造函数中获取片段的实例并调用该方法。

public SurveyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setOrientation(VERTICAL);
        options = new ArrayList<>();
    myActivity = (AppCompatActivity)context;
                myActivity.getFragmentManager().findFragmentByTag("MULTIPLE_CHOICE_POLL_FRAGMENT");
            myActivity.update();
}

这也是returns一个空指针....

我的片段是:

public class MultipleChoicePollFragment extends Fragment implements SurveyView.UpdatePolls

而我实现的方法是:

@Override
public void update() {
    Toast.makeText(getActivity(), "Success", Toast.LENGTH_SHORT).show();
}

您可以使用侦听器(您的片段)并将其添加到您的视图 (setListener)。或者您可以使用事件总线(GreenRobot, Otto 等)。目标是提交一个事件,然后有人通过订阅/取消订阅来收听它。

与其在构建自定义视图时尝试获取它,不如等到 onCreateView() 并通过 public 方法自己注册片段。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle saved) {
    View view = inflater.inflate(...);
    SurveyView surveyView = (SurveyView) view.findViewById(...);
    surveyView.setUpdatePolls(this);
    ...
    return view;
}

那么您的 SurveyView 只需要在尝试调用该方法之前进行一些空值检查(以确保已注册某些内容)。

if (updatePolls != null) {
    updatePolls.update();
}
myActivity = (AppCompatActivity)context;
                myActivity.getFragmentManager().findFragmentByTag("MULTIPLE_CHOICE_POLL_FRAGMENT");

这可行,但您需要使用 getSupportFragmentManager()