簡體   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