Java 如何在微调器';是否在片段中插入MSelected()?
我试图在Java 如何在微调器';是否在片段中插入MSelected()?,java,android,nullpointerexception,fragment,Java,Android,Nullpointerexception,Fragment,我试图在微调器的onItemSelected()方法中使用getApplication()来尝试使用ViewModelProviders获取ViewModel。此时,我有4个内部类,在启动此活动几秒钟后,我遇到了java.lang.NullPointerException崩溃 题目相当准确地概括了我的问题 以下是片段的onCreateView()方法: @Override public View onCreateView(LayoutInflater inflater, View
微调器的onItemSelected()
方法中使用getApplication()
来尝试使用ViewModelProviders
获取ViewModel
。此时,我有4个内部类,在启动此活动几秒钟后,我遇到了java.lang.NullPointerException
崩溃
题目相当准确地概括了我的问题
以下是片段
的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;
}
重写onAttach()以获得如下活动:
private Activity;
@凌驾
公共void-onAttach(上下文){
super.onAttach(上下文);
if(活动的上下文实例){
mActivity=(活动)上下文;
}
}
然后使用mActivity.getApplication()访问应用程序对象
如果需要应用程序上下文,可以从adapterView获取应用程序上下文
adapterView.getContext().getApplicationContext()
如果您的片段附加到MenuActivity,则可以按如下方式获取应用程序对象:
((MenuActivity)adapterView.getContext()).getApplication()
你确定这是失败的路线,而不是紧随其后的路线吗?错误消息表示错误来自第198行的getActivity()
。为什么不在下一行使用menuAct
,而不是getActivity()
?我敢肯定。当我点击MenuActivity;198
在堆栈跟踪上,注释行是高亮显示的行。我没有在那一行使用menuAct
,因为我不知道它是否有效。我正在尝试getApplication()
,而不是getApplicationContext()
。ViewModelProviders希望我传递一个应用程序,而不是上下文。是否要传递应用程序对象以访问其方法?我只想传递应用程序对象。@SikuM。我更新了答案以获得申请object@SikuM. 请重写更新的答案中显示的片段onAttach(),因为getActivity()有时会为null,所以最好在片段附加上获取活动。
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)