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)