Android,如何从不同的类中访问Fragment方法

3

我有一个片段(Fragment)

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

但是这显示出了无法解析方法 '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,而是继承CustomFrag。 - VenomVendor
@VenomVendor 它仍然给我同样的NullPointerException。 - Birrel
通过使用接口,你可以从你的类中调用 refreshList()。 - Ajit Kumar Dubey
你能发布你的日志吗? - VenomVendor
请查看问题编辑,附带临时解决方案。 - Birrel
3个回答

7

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

这会导致内存泄漏。 - Regex

1
问题在于您需要获取片段的活动上下文。您不能仅创建一个扩展片段类的新类,而不实例化该片段并将其与活动关联,并希望从中获取回您的活动上下文。
如果您希望独立于片段使用SomeClass,则可以声明一个变量来保存父活动: private FragmentActivity mActivity;
然后在构造函数中,您可以将活动上下文引用传递给它。
public SomeClass (FragmentActivity activity) {
    mActivity = activity;
    ...
}

之后,您可以调用:

mActivity.getSupportFragmentManager().findFragmentByTag(tagName);

当你需要在SomeClass内部使用它时。

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

我应该把 new YourClass().setListener(CustomFrag .this); 放在哪里?YourClass 应该是 SomeClass 吗?另外,方法中的 activity 是什么?难道不应该是 callBack 吗? - Birrel
你的对话是在fragment和yourClass之间进行的,是吗?为此这个东西存在。 - Ajit Kumar Dubey
请提供要翻译的具体内容。 - Ajit Kumar Dubey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接