Android,Access Fragment方法来自单独的类

时间:2015-09-23 05:41:55

标签: java android android-fragments method-call

我有片段

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的方法仍然会很好。

欢迎提出解决此问题的更多答案,并将其视为解决方案。

3 个答案:

答案 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();