在Fragment中的onCreateView之前调用的setUserVisibleHint

我正在研究ViewPager和使用Fragment那里


在Fragment中的onCreateView()之前调用的setUserVisibleHint()


我正在使用Fragment支持库android.support.v4.app.Fragment


这是图书馆的问题吗?


我该如何摆脱呢?


编辑


我重写setUserVisibleHint(),而不是调用super摆脱它。


@Override

public void setUserVisibleHint(boolean isVisibleToUser) {

    //FIXED: setUserVisibleHint() called before onCreateView() in Fragment causes NullPointerException

    //super.setUserVisibleHint(isVisibleToUser);

}


隔江千里
浏览 970回答 3
3回答

慕田峪7331174

// create boolean for fetching dataprivate boolean isViewShown = false;@Overridepublic void setUserVisibleHint(boolean isVisibleToUser) {    super.setUserVisibleHint(isVisibleToUser);    if (getView() != null) {        isViewShown = true;        // fetchdata() contains logic to show data when page is selected mostly asynctask to fill the data        fetchData();    } else {        isViewShown = false;    }} 使用isViewShown实例变量来决定要在中onCreateView()还是在中获取数据setUserVisibleHint()。下面的代码包含以下逻辑onCreateView():@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,        Bundle savedInstanceState) {    View view = inflater.inflate(R.layout.main_layout, container, false);   // view initialization steps.......   if (!isViewShown) {        fetchData();   }    // do other stuff}此代码将解决您的问题。因为它解决了我的问题。:)这个技巧将获取数据,onCreateView()以便直接从一页跳转到另一页,而当您滑动视图时,它将从setUserVisibleHint()方法中获取数据。:)

明月笑刀无情

您可以使用此逻辑,也可以viewDidAppear通过设置随时关闭isVisible = falsepublic class MyFragment extends Fragment {    private Boolean isStarted = false;    private Boolean isVisible = false;    @Override    public void onStart() {        super.onStart();        isStarted = true;        if (isVisible && isStarted){            viewDidAppear();        }    }    @Override    public void setUserVisibleHint(boolean isVisibleToUser) {        super.setUserVisibleHint(isVisibleToUser);        isVisible = isVisibleToUser;        if (isStarted && isVisible) {            viewDidAppear();        }    }    public void viewDidAppear() {       // your logic    }}

慕盖茨4494581

我找到了最好的解决方案private boolean isVisible;private boolean isStarted;@Overridepublic void onStart() {    super.onStart();    isStarted = true;    if (isVisible)        sendRequest(); //your request method}@Overridepublic void onStop() {    super.onStop();    isStarted = false;}@Overridepublic void setUserVisibleHint(boolean isVisibleToUser) {    super.setUserVisibleHint(isVisibleToUser);    isVisible = isVisibleToUser;    if (isVisible && isStarted)        sendRequest(); //your request method}它是票价namrouti的答案的改进版本。我在许多条件下进行了测试。它是安全的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Android