java - 如何在片段内的 Spinner 的 onItemSelected() 中使用 getApplication()?
问题描述
我正在尝试使用getApplication()
inside aSpinner
的onItemSelected()
方法来尝试获取ViewModel
using ViewModelProviders
。在这一点上,我就像 4 个内部类一样,并且java.lang.NullPointerException
在启动此活动后几秒钟内我遇到了崩溃。
问题标题非常准确地总结了我的问题。
这是Fragment
's 的onCreateView()
方法:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View rootView = inflater.inflate(R.layout.fragment_menu, container, false);
final MenuActivity menuAct = (MenuActivity) getActivity();
final MenuViewModel viewModel = ViewModelProviders.of(this, new MenuViewModelFactory(menuAct.getApplication(), MenuActivity.ResID)).get(MenuViewModel.class);
viewModel.getAllMenuTitles().observe(this, new Observer<String[]>() {
@Override
public void onChanged(String[] strings) {
final Spinner spinner = rootView.findViewById(R.id.spinner);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getContext(), R.layout.support_simple_spinner_dropdown_item, strings);
adapter.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
menuAct.removeAllTabs();
SubMenuViewModel vm = ViewModelProviders.of(getParentFragment(), new SubMenuViewModelFactory(menuAct.getApplication(), i)).get(SubMenuViewModel.class); //← This is the problematic getApplication()
vm.getSubMenus().observe(getActivity(), new Observer<String[]>() {
@Override
public void onChanged(@Nullable String[] strings) {
menuAct.populateTabs(strings);
}
});
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
}
});
return rootView;
}
这是我的堆栈跟踪:
java.lang.NullPointerException: Attempt to invoke virtual method 'android.support.v4.app.FragmentActivity android.support.v4.app.Fragment.getActivity()' on a null object reference
at android.arch.lifecycle.ViewModelProviders.checkActivity(ViewModelProviders.java:50)
at android.arch.lifecycle.ViewModelProviders.of(ViewModelProviders.java:100)
at com.whatamidoingwithmylife.splitbill.MenuActivity$PlaceholderFragment$1$1.onItemSelected(MenuActivity.java:198)
at android.widget.AdapterView.fireOnSelected(AdapterView.java:944)
at android.widget.AdapterView.dispatchOnItemSelected(AdapterView.java:933)
at android.widget.AdapterView.-wrap1(Unknown Source:0)
at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:898)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:440)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
解决方案
覆盖onAttach()以获取活动,如下所示,
private Activity mActivity;
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof Activity){
mActivity=(Activity) context;
}
}
然后使用mActivity.getApplication()访问应用程序对象。
如果想要应用上下文,可以从adapterView中获取应用上下文,
adapterView.getContext().getApplicationContext()
如果您的片段附加到 MenuActivity 那么您可以获得应用程序对象,如下所示,
((MenuActivity)adapterView.getContext()).getApplication()
推荐阅读
- python - 是否有另一种方法来获取代理列表和网站抓取?
- xml - XML 文件,XSD 架构错误:无法将名称解析为(n)“类型定义”,找不到元素的声明
- python-3.x - 使用 python 调用脚本后,对 mpirun 的 os.system() 调用不起作用
- retrofit - 如何在php中接受随机数量的上传文件?
- java - 在 JNI 中,如何从 C++ 访问 Java 中 JSONObject 的值,将一些值放入其中并返回?
- express - 为什么 app.use 之后定义的路由在获取请求后没有返回任何内容?
- swift - 如何在按钮单击时在 uimageview 中显示不同的图像
- c# - MsTest 并行化
- javascript - 从模块导入类
- forms - 使用 appBar 图标打开表单