在自定义视图中调用片段方法
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()
。
因此,对于某些背景,我尝试在自定义视图中调用我的片段(托管自定义视图)中的方法。
我试过使用接口并在片段中实现它。我还尝试在自定义视图中获取片段的实例并以这种方式调用方法。无论出于何种原因,我都得到空指针。
方式#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()
。