我有片段:
public class CustomFrag extends Fragment{
...
public void refreshList(){
...
}
}
我有一个单独的类:
public class SomeClass{
...
}
我正在尝试从refreshList()
致电SomeClass
:
String tagName = "android:switcher:" + R.id.pager + ":" + 1;
CustomFrag f2 = (CustomFrag)getActivity().getSupportFragmentManager().findFragmentByTag(tagName);
f2.refreshList();
但是这会显示 Cannot resolve method 'getActivity'
。如果我加入课程:
extends Fragment
所有警告消失,但应用程序崩溃,CustomFrag f2 = (CustomFrag)...
行有一个空指针异常。
我有另一个片段,包含在与CustomFrag
相同的父级中,并且上述方法调用效果很好。
如何从CustomFrag
访问SomeClass
方法?这个问题(和类似问题)都被问到了,但大多数都没有得到接受的答案,或者有一些非常含糊的问题。
提前致谢。
编辑:临时解决方案
我从上述两个片段中调用属于SomeClass
的方法。我想出的是以下内容:
FragOne
public class FragOne extends Fragment{
...
String tagName = "android:switcher:" + R.id.pager + ":" + 1;
CustomFrag f2 = (CustomFrag)getActivity().getSupportFragmentManager().findFragmentByTag(tagName);
}
然后:
public class FragOne extends Fragment{
...
String tagName = "android:switcher:" + R.id.pager + ":" + 1;
CustomFrag f2 = (CustomFrag)getActivity().getSupportFragmentManager().findFragmentByTag(tagName);
SomeClass obj = new SomeClass(...);
obj.someMethod(f2);
}
someMethod
可以使用
f2.refreshList();
这解决了我一直遇到的问题,但是通过一个单独的类来了解更直接的方法来访问Fragment的方法仍然会很好。
欢迎提出解决此问题的更多答案,并将其视为解决方案。
答案 0 :(得分:3)
HomeFragment.java
public class HomeFragment extends Fragment {
private static HomeFragment instance;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_home, container, false);
instance = this;
return view;
}
public static HomeFragment getInstance() {
return instance;
}
public void myMethod() {
// do something...
}
}
AnotherClass.java
public Class AnotherClass() {
// call this method
HomeFragment.getInstance().myMethod();
}
答案 1 :(得分:1)
问题是您需要获取片段的活动上下文。你不仅可以构建一个扩展片段类的新类,而不实际实例化片段并将其与活动相关联,并希望从中获取活动上下文。
如果您希望独立于片段使用SomeClass
,您可以声明一个变量来保存父活动
private FragmentActivity mActivity;
然后在构造函数中,您可以将活动上下文引用传递给它。
public SomeClass (FragmentActivity activity) {
mActivity = activity;
...
}
然后,您可以致电
mActivity.getSupportFragmentManager().findFragmentByTag(tagName);
在SomeClass
内需要时。
答案 2 :(得分:0)
为该
创建界面public interface Callback{
void refreshList();
}
这是你的片段
public class CustomFrag extends Fragment implements Callback{
...
new SomeClass().setListener(CustomFrag .this);
@Override
public void refreshList(){
//do work
}
}
写你的课
public class SomeClass{
private Callback mCallback;
public void setListener(Callback callBack){
mCallback=callBack;
}
}
从你的SomeClass中调用Fragment refreshListview,如下所示
mCallback.refreshListView();