我尝试使用Fragment
,ViewPager
和TabLayout
。
现在我在片段中启动服务命令时遇到问题。
我有我的服务:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
....
}
我希望当我在TabLayout中更改选项卡时,选择的片段会提出服务请求。
所以我试过这个:
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
Bundle extras = new Bundle();
Intent msgIntent = new Intent(getActivity(), myService.class);
msgIntent.setAction("INIT_REQUEST");
msgIntent.putExtra("id", sectionNumber);
msgIntent.putExtras(extras);
getActivity().startService(msgIntent);
}
但问题是在 getActivity()中抛出异常,因为它为null:
引起:java.lang.NullPointerException:尝试调用虚拟 方法' java.lang.String android.content.Context.getPackageName()'上 空对象引用
我哪里错了?
答案 0 :(得分:0)
将ViewPager.OnPageChangeListener
添加到ViewPager
并覆盖onPageSelected
。您可以从那里向您的服务发送命令。
此外,如果您的片段数量不是很重,您可以在ViewPager上调用setOffsPageLimit(int limit)
以将更多片段保留在内存中,这应该避免NullPointerException
。
注意:这还取决于您的寻呼机适配器实施。
答案 1 :(得分:0)
viewPager
始终只加载一个fragment
。所以,假设您有3 fragments
,而您最初只有一个setUserVisibleHint
。现在,当你转到第二个片段时,fragment
将不会为空,因为onCreate
已经加载了,但是当你从第一个片段转到第三个片段时,它将通过你的异常,所以你可以肯定它启动片段的服务onAttach()
,或者也可以在片段的@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle extras = new Bundle();
Intent msgIntent = new Intent(getActivity(), myService.class);
msgIntent.setAction("INIT_REQUEST");
msgIntent.putExtra("id", sectionNumber);
msgIntent.putExtras(extras);
getActivity().startService(msgIntent);
}
中执行此操作。
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (((MainActivity) getActivity() != null) {
Bundle extras = new Bundle();
Intent msgIntent = new Intent(getActivity(), myService.class);
msgIntent.setAction("INIT_REQUEST");
msgIntent.putExtra("id", sectionNumber);
msgIntent.putExtras(extras);
getActivity().startService(msgIntent);
}
}
并在使用时检查您的活动是否为空。
DISTINCT
另请看一下这个答案。它可能对你有帮助。 setUserVisibleHint() throwing NullPointerException when calling getActivity()