简体   繁体   English

空指针异常-片段活动

[英]Null pointer exception - Fragment Activity

I'm fairly new to this and have managed to get the layout of my app and am using tabs and fragments. 我对此还很陌生,并且设法获得了应用程序的布局,并且正在使用标签和片段。

Each layout is a different calculator and requires different calculations to run. 每个布局都是一个不同的计算器,并且需要不同的计算才能运行。 Im struggling to figure out how to do this. 我正在努力弄清楚该如何做。 Any help is much appreciated. 任何帮助深表感谢。

This first thing that i'm trying to get to work is the spinnersetup for the BMI fragment. 我要开始工作的第一件事是BMI片段的spinnersetup。 Do I do this in the MainActivity or the Fragment? 我要在MainActivity或Fragment中执行此操作吗? From what I have done so far I get a null pointer exception. 到目前为止,我已经做过一个空指针异常。

Here is my MainActivity code: 这是我的MainActivity代码:

public Fragment getItem(int position) {
            // getItem is called to instantiate the fragment for the given page.
            // Return a DummySectionFragment (defined as a static inner class
            // below) with the page number as its lone argument.
            switch (position) {
            case 0:
                Fragment fragment = new DummySectionFragment();
                Bundle args = new Bundle();
                args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, position + 1);
                fragment.setArguments(args);
                return fragment;

              case 1:
                Fragment fragment1 = new DummySectionFragment1();
                Bundle args1 = new Bundle();
                args1.putInt(DummySectionFragment1.ARG_SECTION_NUMBER, position + 2);
                fragment1.setArguments(args1);
                return fragment1;

              case 2:

                 Fragment fragment2 = new DummySectionFragment2();
                 Bundle args2 = new Bundle();
                 args2.putInt(DummySectionFragment2.ARG_SECTION_NUMBER, position + 3);
                 fragment2.setArguments(args2);
                 return fragment2;

              case 3:

                     Fragment fragment3 = new DummySectionFragment3();
                     Bundle args3 = new Bundle();
                     args3.putInt(DummySectionFragment3.ARG_SECTION_NUMBER, position + 4);
                     fragment3.setArguments(args3);
                     return fragment3;

            default:
                return null;
            }
        }

        @Override
        public int getCount() {
            // Show 4 total pages.
            return 4;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            Locale l = Locale.getDefault();
            switch (position) {
            case 0:
                return getString(R.string.title_section1).toUpperCase(l);
            case 1:
                return getString(R.string.title_section2).toUpperCase(l);
            case 2:
                return getString(R.string.title_section3).toUpperCase(l);
            case 3:
                return getString(R.string.title_section4).toUpperCase(l);
            }
            return null;
        }
    }

}

My Fragment code: 我的片段代码:

package com.HealthKicks.bodystats.admob;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;

public class DummySectionFragment extends Fragment {

    EditText height_edit_text1, weight_edit_text1, height, weight;
    Spinner height_spinner, weight_spinner;
    Button calculatebmi;

    public static final String ARG_SECTION_NUMBER = "section_number";

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

        setupSpinners();

        height_spinner =(Spinner) getView().findViewById(R.id.height_spinner);
        weight_spinner =(Spinner) getView().findViewById(R.id.weight_spinner);
        height_edit_text1 =(EditText) getView().findViewById(R.id.height_edit_text1);
        weight_edit_text1 =(EditText) getView().findViewById(R.id.weight_edit_text1);
        weight_spinner =(Spinner) getView().findViewById(R.id.weight_spinner);

        return rootView;
    }


    void setupSpinners() {

        height_spinner =(Spinner) getView().findViewById(R.id.height_spinner);
        weight_spinner =(Spinner) getView().findViewById(R.id.weight_spinner);
        height_edit_text1 =(EditText) getView().findViewById(R.id.height_edit_text1);
        weight_edit_text1 =(EditText) getView().findViewById(R.id.weight_edit_text1);

        // TODO Auto-generated method stub
            height_spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                if (position == 0){
                    height_edit_text1.setVisibility(View.GONE);
                } else {
                    height_edit_text1.setVisibility(View.VISIBLE);
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });
                weight_spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                    @Override
                    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                        if (position == 0){
                            weight_edit_text1.setVisibility(View.GONE);
                        } 
                        else if (position == 1){
                            weight_edit_text1.setVisibility(View.GONE);
                        }
                        else {
                            weight_edit_text1.setVisibility(View.VISIBLE);
                        }
                    }

                    @Override
                    public void onNothingSelected(AdapterView<?> parent) {

                    }
                });
    }   
}

LogCat: logcat的:

10-10 18:38:40.959: E/AndroidRuntime(1118): FATAL EXCEPTION: main
10-10 18:38:40.959: E/AndroidRuntime(1118): java.lang.NullPointerException
10-10 18:38:40.959: E/AndroidRuntime(1118):     at com.HealthKicks.bodystats.admob.DummySectionFragment.setupSpinners(DummySectionFragment.java:33)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at com.HealthKicks.bodystats.admob.DummySectionFragment.onCreateView(DummySectionFragment.java:26)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at android.support.v4.app.Fragment.performCreateView(Fragment.java:1478)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1460)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:472)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at android.support.v4.view.ViewPager.populate(ViewPager.java:1068)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at android.support.v4.view.ViewPager.populate(ViewPager.java:914)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1436)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at android.view.View.measure(View.java:15848)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at android.view.View.measure(View.java:15848)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:302)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at android.view.View.measure(View.java:15848)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2189)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at android.view.View.measure(View.java:15848)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1905)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1104)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1284)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5481)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at android.view.Choreographer.doCallbacks(Choreographer.java:562)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at android.view.Choreographer.doFrame(Choreographer.java:532)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at android.os.Handler.handleCallback(Handler.java:730)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at android.os.Handler.dispatchMessage(Handler.java:92)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at android.os.Looper.loop(Looper.java:137)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at android.app.ActivityThread.main(ActivityThread.java:5103)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at java.lang.reflect.Method.invokeNative(Native Method)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at java.lang.reflect.Method.invoke(Method.java:525)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-10 18:38:40.959: E/AndroidRuntime(1118):     at dalvik.system.NativeStart.main(Native Method)

Change onCreateView from this: 从此更改onCreateView:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.bmi, container, false);
    setupSpinners();
    height_spinner = (Spinner) getView().findViewById(R.id.height_spinner);
    weight_spinner = (Spinner) getView().findViewById(R.id.weight_spinner);
    height_edit_text1 = (EditText) getView().findViewById(R.id.height_edit_text1);
    weight_edit_text1 = (EditText) getView().findViewById(R.id.weight_edit_text1);
    weight_spinner = (Spinner) getView().findViewById(R.id.weight_spinner);
    return rootView;
}

to this: 对此:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.bmi, container, false);
    height_spinner = (Spinner) rootView.findViewById(R.id.height_spinner);
    weight_spinner = (Spinner) rootView.findViewById(R.id.weight_spinner);
    height_edit_text1 = (EditText) rootView.findViewById(R.id.height_edit_text1);
    weight_edit_text1 = (EditText) rootView.findViewById(R.id.weight_edit_text1);
    weight_spinner = (Spinner) rootView.findViewById(R.id.weight_spinner);
    return rootView;
}

Call setupSpinners from onViewCreated : 呼叫setupSpinnersonViewCreated

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    setupSpinners();
}

and it would be more efficient if you pass the view as parameter so don't call everytime getView() : 如果将view作为参数传递,则效率会更高,因此不要每次都调用getView()

You are running your initialization of all your members twice. 您正在对所有成员进行两次初始化。

In the body of onCreateView() you call setupSpinners(); onCreateView()的主体中,您调用setupSpinners(); which initializes your members, and then you re-initialize them. 这将初始化您的成员,然后您将其重新初始化。 Initialize them in one place only. 仅在一个地方初始化它们。

None of your views are initialized in your DummySectionFragment. 您的视图均未在DummySectionFragment中初始化。 You have to tell what is each Spinner, something like: 您必须告诉每个Spinner是什么,例如:

height_spinner = (Spinner) getView().findViewById(R.id.theIdInTheLayoutFile);
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.bmi, container, false);
    height_spinner = (Spinner) rootView.findViewById(R.id.height_spinner);
    weight_spinner = (Spinner) rootView.findViewById(R.id.weight_spinner);
    height_edit_text1 = (EditText) rootView.findViewById(R.id.height_edit_text1);
    weight_edit_text1 = (EditText) rootView.findViewById(R.id.weight_edit_text1);
    weight_spinner = (Spinner) rootView.findViewById(R.id.weight_spinner);

    setUpSpinners(rootView);  
    return rootView;
}

protected void setUpSpinners(pass rootview here...)
{
      ...use spinners as 
      Spinner weight_spinner = (Spinner) rootView.findViewById(R.id.weight_spinner);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM