无法启动活动:空指针异常

时间:2013-08-01 10:58:01

标签: android

我正在Android应用程序中开发一个使用“Fixed Tabs + Swipe”模型的活动。此活动中的每个“标签”将用于存储不同类型的联系信息。第一个存储名称,性别,移动设备,出生日期等。下一个选项卡将存储地址信息 - 以下选项卡将存储其他信息。

所以在第一个标签上,我希望有一个微调器就像一个“下拉菜单”,用于选择人的头衔(先生/女士/夫人等)。我的strings.xml中的字符串数组定义如下:

<string-array name="titles">
    <item>"Mr."</item>
    <item>"Miss"</item>
    <item>"Ms."</item>
    <item>"Mrs."</item>
    <item>"Dr."</item>        
</string-array>

但是我试图在代码中填充微调器,我在行titleSpinner.setAdapter(adapter);上得到一个空指针异常。这是我的活动代码:

public class ModifyCustActivity extends FragmentActivity implements
        ActionBar.TabListener {

private static final int NUM_PAGES = 2;
private static final int DATE_DIALOG = 0;

SectionsPagerAdapter mSectionsPagerAdapter;
ViewPager mViewPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_modify_cust);

    final ActionBar actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    actionBar.setDisplayHomeAsUpEnabled(true);

    mSectionsPagerAdapter = new SectionsPagerAdapter(
            getSupportFragmentManager());
    mViewPager = (ViewPager) findViewById(R.id.pager);
    mViewPager.setAdapter(mSectionsPagerAdapter);

    mViewPager
            .setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
                @Override
                public void onPageSelected(int position) {
                    actionBar.setSelectedNavigationItem(position);
                }
            });

    for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
        actionBar.addTab(actionBar.newTab()
                .setText(mSectionsPagerAdapter.getPageTitle(i))
                .setTabListener(this));
    }
    setupTitleSpinner();
}

private void setupTitleSpinner() {      
    Spinner titleSpinner = (Spinner) findViewById(R.id.spnTitle);       
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
            R.array.titles, android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    titleSpinner.setAdapter(adapter); // EXCEPTION OCCURS HERE
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.modify_cust, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case android.R.id.home:
        NavUtils.navigateUpFromSameTask(this);
        return true;
    }
    return super.onOptionsItemSelected(item);
}

@Override
public void onTabSelected(ActionBar.Tab tab,
        FragmentTransaction fragmentTransaction) {
    mViewPager.setCurrentItem(tab.getPosition());
}

@Override
public void onTabUnselected(ActionBar.Tab tab,
        FragmentTransaction fragmentTransaction) {
}

@Override
public void onTabReselected(ActionBar.Tab tab,
        FragmentTransaction fragmentTransaction) {
}

public class SectionsPagerAdapter extends FragmentPagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        Fragment fragment = new DummySectionFragment();
        switch (position) {
        case 0:
            return fragment = new FragmentCustBasic();
        case 1:
            return fragment = new FragmentCustAddress();
        default:
            break;
        }
        return fragment;
    }

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

    @Override
    public CharSequence getPageTitle(int position) {
        switch (position) {
        case 0:
            return "Basic";
        case 1:
            return "Address";
        }
        return null;
    }
}

public static class FragmentCustBasic extends Fragment {
    public static final String ARG_SECTION_NUMBER = "section_number";
    public FragmentCustBasic() {
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(
                R.layout.fragment_modify_cust_basic, container, false);
                return rootView;
    }
}

public static class FragmentCustAddress extends Fragment {
    public static final String ARG_SECTION_NUMBER = "section_number";
    public FragmentCustAddress() {
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(
                R.layout.fragment_modify_cust_address, container, false);
                return rootView;
    }
}

public static class DummySectionFragment extends Fragment {

    public static final String ARG_SECTION_NUMBER = "section_number";

    public DummySectionFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View rootView = inflater.inflate(
                R.layout.fragment_modify_cust_basic, container, false);
        return rootView;
    }
}
}

这是活动的xml:

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/androidbg_dark"
    tools:context=".ModifyCustActivity" />

这是其中一个片段的xml文件(有问题的片段 - 上面有微调器):

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".ModifyCustActivity$DummySectionFragment" >

    <EditText
        android:id="@+id/txtFirstName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:ems="10"
        android:hint="@string/fname"
        android:inputType="textPersonName|textCapWords"
        android:textColor="#FFFFFF" >

        <requestFocus />
       </EditText>

    <EditText
        android:id="@+id/txtLastName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/txtFirstName"
        android:ems="10"
        android:hint="@string/lname"
        android:inputType="textPersonName|textCapWords"
        android:textColor="#FFFFFF" >

    </EditText>

    <EditText
        android:id="@+id/txtMobileNumber"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/txtLastName"
        android:ems="10"
        android:hint="@string/mobile"
        android:inputType="phone"
        android:textColor="#FFFFFF" />

    <EditText
        android:id="@+id/txtDate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/txtMobileNumber"
        android:ems="10"
        android:hint="@string/dob"
        android:inputType="date"
        android:textColor="#FFFFFF" />

    <Spinner
        android:id="@+id/spnTitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/txtDate"
        android:textColor="#FFFFFF" />

</RelativeLayout>

这是我的logcat输出:

08-01 11:33:02.445: E/AndroidRuntime(10461): FATAL EXCEPTION: main
08-01 11:33:02.445: E/AndroidRuntime(10461): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myapp/com.example.myapp.ModifyCustActivity}: java.lang.NullPointerException
08-01 11:33:02.445: E/AndroidRuntime(10461):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110)
08-01 11:33:02.445: E/AndroidRuntime(10461):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)
08-01 11:33:02.445: E/AndroidRuntime(10461):    at android.app.ActivityThread.access$700(ActivityThread.java:140)
08-01 11:33:02.445: E/AndroidRuntime(10461):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237)
08-01 11:33:02.445: E/AndroidRuntime(10461):    at android.os.Handler.dispatchMessage(Handler.java:99)
08-01 11:33:02.445: E/AndroidRuntime(10461):    at android.os.Looper.loop(Looper.java:137)
08-01 11:33:02.445: E/AndroidRuntime(10461):    at android.app.ActivityThread.main(ActivityThread.java:4921)
08-01 11:33:02.445: E/AndroidRuntime(10461):    at java.lang.reflect.Method.invokeNative(Native Method)
08-01 11:33:02.445: E/AndroidRuntime(10461):    at java.lang.reflect.Method.invoke(Method.java:511)
08-01 11:33:02.445: E/AndroidRuntime(10461):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
08-01 11:33:02.445: E/AndroidRuntime(10461):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
08-01 11:33:02.445: E/AndroidRuntime(10461):    at dalvik.system.NativeStart.main(Native Method)
08-01 11:33:02.445: E/AndroidRuntime(10461): Caused by: java.lang.NullPointerException
08-01 11:33:02.445: E/AndroidRuntime(10461):    at com.example.myapp.ModifyCustActivity.setupTitleSpinner(ModifyCustActivity.java:102)
08-01 11:33:02.445: E/AndroidRuntime(10461):    at com.example.myapp.ModifyCustActivity.onCreate(ModifyCustActivity.java:93)
08-01 11:33:02.445: E/AndroidRuntime(10461):    at android.app.Activity.performCreate(Activity.java:5206)
08-01 11:33:02.445: E/AndroidRuntime(10461):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
08-01 11:33:02.445: E/AndroidRuntime(10461):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074)
08-01 11:33:02.445: E/AndroidRuntime(10461):    ... 11 more

我是Android开发的新手。

3 个答案:

答案 0 :(得分:0)

您的activity_modify_cust.xml中的ViewPager View位于何处。然后你试图获取不在xml文件中的viewId。如下所示

mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(mSectionsPagerAdapter); 

//所以这一行给你空指针异常

答案 1 :(得分:0)

你应该删除spinner global:

所以

public class ModifyCustActivity extends FragmentActivity implements ActionBar.TabListener {

  Spinner spinner;
  @Override
  protected void onCreate(Bundle savedInstanceState) {

     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_modify_cust);
     spinner = (Spinner) findViewById(R.id.spnTitle);
      .....
     setupTitleSpinner();

  }
  private void setupTitleSpinner() {      

    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
        R.array.titles, android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(adapter); // spinner is now global
 }
}

因为您正在尝试访问未定义的数据..因为您的findViewById可以找到项目只是因为您已经删除了&#34; setContentView&#34;

答案 2 :(得分:0)

我遇到了这个问题,因为我尝试访问的视图包含在一个单独的片段xml文件中。我已经问了一个关于如何执行此操作的单独问题here。感谢您的回复。

相关问题