如果以横向模式启动,则在设置自定义适配器时出现空指针异常

Getting a nullpointerexception on setting custom adapter if started on landscape mode

我在我的项目中遇到了一些奇怪的问题,它在横向模式下启动时触发了空指针适配器。现在的问题是,由于某些问题,我有一个 gridview 只是为了按住按钮,其中这是我唯一的最佳选择。现在适配器非常简单:

public class ActionsAdapter extends BaseAdapter {

    Context context;

    public ActionsAdapter(Context context){
        this.context = context;
    }

    @Override
    public int getCount() {
        return 2;
    }

    @Override
    public Object getItem(int i) {
        return i;
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View  rowView;
        if(i==0) {
            rowView = inflater.inflate(R.layout.button1, viewGroup, false);
            Button button1 = (Button) rowView.findViewById(R.id.btn_1);
            button1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    showPage();
                }
            });
        }else{
            rowView = inflater.inflate(R.layout.button2, viewGroup, false);

        }


        return rowView;


    }

private void showPage(){
        //TODO show page
    }

现在我所做的只是按照我认为的自然方式将此适配器简单地设置到我的 gridview 中:

actions.setAdapter(new ActionsAdapter(getActivity()));

现在这在纵向模式下完美运行,但如果在横向模式下启动,它 returns 一个空指针异常,它指向我上面设置适配器的代码。

这是完整的日志:

FATAL EXCEPTION: main
    Process: com.gmanmi.news.papalvisit2014.mobile, PID: 18353
    java.lang.NullPointerException
            at com.kahel.sample.fragments.Testfragment.onCreateView(Testfragment.java:93)
            at android.support.v4.app.Fragment.performCreateView(Fragment.java:1504)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:942)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1121)
            at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
            at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1484)
            at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:482)
            at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
            at android.support.v4.view.ViewPager.populate(ViewPager.java:1073)
            at android.support.v4.view.ViewPager.populate(ViewPager.java:919)
            at android.support.v4.view.ViewPager.run(ViewPager.java:249)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
            at android.view.Choreographer.doCallbacks(Choreographer.java:574)
            at android.view.Choreographer.doFrame(Choreographer.java:543)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5105)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
            at dalvik.system.NativeStart.main(Native Method)

这是 onCreateView:

@Override
    public View onCreateView(LayoutInflater inflater, final ViewGroup container,
                             final Bundle savedInstanceState) {
        final View view = inflater.inflate(R.layout.fragment_grid_actions, container, false);

        actions = (GridView) view.findViewById(R.id.grid_actions);
        actions.setAdapter(new ActionsAdapter(getActivity()));
 actions.setOnItemClickListener(new AdapterView.OnItemClickListener() {
enter code here
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            if(position==1){
                Toast.makeText(getActivity(), "Show action", Toast.LENGTH_SHORT).show();
            }
        }
    });

    return view;
}

您的问题是在 onCreateView 中调用 getActivity。您不能安全地执行此操作,因为无法保证 Activity 已在此时完全创建,因此是 NPE。将调用移至 setAdapter,将后续调用移至 onActivityCreated

也许this page可以帮助您更好地理解如何处理这个问题。

@2Dee在onCreateView中使用getActivity是对的,此时你无法知道这个activity是否被创建

看看他的回答更准确!!!