为了账号安全,请及时绑定邮箱和手机立即绑定

在Fragment中的onCreateView之前调用的setUserVisibleHint

在Fragment中的onCreateView之前调用的setUserVisibleHint

隔江千里 2019-11-27 10:41:46
我正在研究ViewPager和使用Fragment那里在Fragment中的onCreateView()之前调用的setUserVisibleHint()我正在使用Fragment支持库android.support.v4.app.Fragment这是图书馆的问题吗?我该如何摆脱呢?编辑我重写setUserVisibleHint(),而不是调用super摆脱它。@Overridepublic void setUserVisibleHint(boolean isVisibleToUser) {    //FIXED: setUserVisibleHint() called before onCreateView() in Fragment causes NullPointerException    //super.setUserVisibleHint(isVisibleToUser);}
查看完整描述

3 回答

?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

// create boolean for fetching data

private boolean isViewShown = false;


@Override

public 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():


@Override

public 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()方法中获取数据。:)


查看完整回答
反对 回复 2019-11-27
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

您可以使用此逻辑,也可以viewDidAppear通过设置随时关闭isVisible = false


public 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

    }

}


查看完整回答
反对 回复 2019-11-27
?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

我找到了最好的解决方案


private boolean isVisible;

private boolean isStarted;


@Override

public void onStart() {

    super.onStart();

    isStarted = true;

    if (isVisible)

        sendRequest(); //your request method

}


@Override

public void onStop() {

    super.onStop();

    isStarted = false;

}


@Override

public void setUserVisibleHint(boolean isVisibleToUser) {

    super.setUserVisibleHint(isVisibleToUser);

    isVisible = isVisibleToUser;

    if (isVisible && isStarted)

        sendRequest(); //your request method

}

它是票价namrouti的答案的改进版本。我在许多条件下进行了测试。它是安全的。


查看完整回答
反对 回复 2019-11-27
  • 3 回答
  • 0 关注
  • 969 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信