setUserVisibleHint with Fragments for android
Posted
技术标签:
【中文标题】setUserVisibleHint with Fragments for android【英文标题】: 【发布时间】:2015-11-09 07:42:03 【问题描述】:我在我的 ViewPager 适配器 中使用了 3 个片段。我将从 Parse(parse.com) 加载数据并在回收站视图中显示它们。以下代码导致我的应用程序崩溃。我的理解是,当我的 MainActivity 加载时,这是我的第一个片段,即它立即被用户查看,因此 setUserVisibleHint 函数被立即调用并在该 v.findViewById代码导致空指针异常,因为可能未调用 setContentView hasnt/。我的证明是,如果我向 setUserVisisbleHint 添加 1 秒延迟,那么我的代码可以正常工作。
现在我想使用 Parse 添加服务器 PULL 请求,将列表中的数据添加到适配器并在用户查看页面后填充 recyclerview
1) 我是否应该在 setUserVisisbleHint 中添加所有代码并添加 0.5secc 延迟,以便在调用 setContentView 后执行它,确保我没有收到空指针异常错误或
2) 有没有更好的方法/我可以使用其他功能来实现相同的功能?
public class NewsFeed extends Fragment
LinearLayoutManager mLayoutManager;
boolean _areLecturesLoaded=false;
View v;
ProgressBar bar;
public NewsFeed()
// Required empty public constructor
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState)
// Inflate the layout for this fragment
v=inflater.inflate(R.layout.fragment_news_feed, container, false);
RecyclerView mRecyclerView = (RecyclerView)v.findViewById(R.id.recycler_view);
mRecyclerView.setHasFixedSize(true);
mLayoutManager = new LinearLayoutManager(v.getContext());
mRecyclerView.setLayoutManager(mLayoutManager);
MyStickyAdapter mAdapter = new MyStickyAdapter(v.getContext());
mRecyclerView.setAdapter(mAdapter);
// mRecyclerView.addItemDecoration(new StickyRecyclerHeadersDecoration(mAdapter));
return v;
@Override
public void setUserVisibleHint(boolean isVisibleToUser)
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser && !_areLecturesLoaded )
_areLecturesLoaded = true;
v.findViewById(R.id.asd).setVisibility(View.GONE);
//Closes Fragment
我将这个库用于我的回收站视图StickyHeaderRecyclerView
【问题讨论】:
阅读这个有用的答案***.com/a/39911028/3496570 【参考方案1】:我强烈建议避免添加延迟,特别是如果您在主线程上运行它。为避免 NPE,请在为视图充气后尝试将 findViewById(R.id.asd) 移动到 onCreateView 方法中:
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState)
// Inflate the layout for this fragment
v=inflater.inflate(R.layout.fragment_news_feed, container, false);
v.findViewById(R.id.asd).setVisibility(View.GONE);
这是假设 R.id.asd 在 R.layout.fragment_news_feed 中
这篇文章还可以提供一些见解: setUserVisibleHint called before onCreateView in Fragment
【讨论】:
这个片段被立即查看。在这种情况下,可以在 onCreate 完成之前引用进度条。这再次引发空指针异常。 在视图膨胀之前,您无法真正绕过访问视图中的元素。是否可以在视图膨胀后移动您正在执行的任何视图操作? 第一个片段总是在应用程序启动时加载,因此我将 setUserVisbleHunt 作为其多余部分从中删除,并将其用于其他工作正常的片段。 是的,另一个片段的 onCreate 总是在用户能够滑动到它们之前完成,所以在这种情况下没有崩溃,对于第一个片段,我已经将 setUserVisibleHint 全部删除,因为它并不真正需要,所以这也不会导致崩溃。问题是您无法在视图膨胀后移动操作,因为 setUserVisibleHint 本身是一个带有 @Override 的单独函数,因此一旦应用程序启动,它就会自动调用。不过感谢您的帮助。以上是关于setUserVisibleHint with Fragments for android的主要内容,如果未能解决你的问题,请参考以下文章
关于Fragment的setUserVisibleHint() 方法和onCreateView()的执行顺序
Fragment的setUserVisibleHint方法实现懒加载
setUserVisibleHint的使用.执行顺序和viewPager.setOffscreenPageLimit不管用还是默认会加载第二个fragment
FragmentPagerAdapter加载fragment并使用setUserVisibleHint()处理预加载时遇到的坑,给textview赋值时出现的空指针异常