「固定タブ + スワイプ」モデルを使用する Android アプリケーション内でアクティビティを開発しています。このアクティビティの各「タブ」は、さまざまなタイプの連絡先情報を保存するために使用されます。最初のタブには、名前、性別、携帯電話、生年月日などが保存されます。次のタブには住所情報が保存され、次のタブにはその他の情報が保存されます。
そのため、最初のタブでは、人の役職 (Mr/Ms/Mrs など) を選択するための「ドロップダウン メニュー」のように機能するスピナーが必要でした。私は次の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" />
そして、これがフラグメントの 1 つの 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
私はアンドロイド開発が初めてです。