繁体   English   中英

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

[英]Android, Access Fragment method from separate class

我有一个片段

public class CustomFrag extends Fragment{
    ...
    public void refreshList(){
        ...
    }
}

我有一个单独的班级

public class SomeClass{
    ...
}

我试图从SomeClass调用refreshList()

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相同的父节点中,并且上面描述的方法调用效果很好。

如何从SomeClass访问CustomFrag方法? 这个问题(和类似的问题)都被问到了,但是大多数问题都没有得到接受,或者有一些非常含糊的问题。

提前致谢。

编辑:临时解决方案

我在前面提到的两个片段中调用属于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的方法仍然是一件好事。

解决此问题的其他答案是受欢迎的,并将被接受为解决方案。

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();
}

问题是您需要获取片段的活动上下文。 您不仅可以构建一个扩展片段类的新类,而无需实际实例化片段并将其与活动相关联,并希望从中获取活动上下文。

如果您希望独立于Fragment使用SomeClass ,则可以声明一个变量来保存父活动

private FragmentActivity mActivity;

然后在构造函数中,您可以将活动上下文引用传递给它。

public SomeClass (FragmentActivity activity) {
    mActivity = activity;
    ...
}

之后,你可以打电话

mActivity.getSupportFragmentManager().findFragmentByTag(tagName);

当你在SomeClass需要它时。

为此创建接口

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM