Ich versuche, einen benutzerdefinierten Spinner für meine Kalenderansicht zu verwenden. Ich habe meinen eigenen benutzerdefinierten Adapter geschrieben. Die Ansicht lädt anfangs gut, aber sobald ich versuche, auf eines der Elemente im Dropdown-Menü des Spinner zu klicken, stürzt die App ab.NullPointerException beim Versuch, in CustomSpinner auf TextView zuzugreifen
Es folgt mein Tätigkeitscode:
public class CalendarEventsActivity extends Activity {
protected ActivityHeader mHeader;
private Spinner mMonthDropdown;
@Override
protected void beforeMainContentCreated(Bundle savedInstanceState) {
}
public void onCreateMainContent(Bundle savedInstanceState) {
super.onCreateMainContent(savedInstanceState);
setRequestedOrientationByResourceID(R.integer.allow_landscape_calendar_events_activity);
getWindow().setBackgroundDrawable(null);
setContentView(R.layout.activity_calendar_events);
mHeader = (ActivityHeader) findViewById(R.id.header);
getSlidingMenu().setSlidingEnabled(false);
setupMonthSpinner();
}
private void setupMonthSpinner() {
mMonthDropdown = (Spinner) findViewById(R.id.month_spinner);
String[] items = new String[] { "January", "February", "March",
"April", "May", "June", "July", "August", "September",
"October", "November", "December" };
mMonthDropdown.setAdapter(new MyAdapter(this, R.layout.calendar_month_item, items));
mMonthDropdown.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
System.out.println("you have now clicked......."+((TextView)parent.getChildAt(position)).getText().toString());
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
// TODO Auto-generated method stub
}
});
}
public class MyAdapter extends ArrayAdapter<String> {
String[] calendar_months;
public MyAdapter(Context context, int textViewResourceId,
String[] objects) {
super(context, textViewResourceId, objects);
this.calendar_months = objects;
}
@Override
public View getDropDownView(int position, View convertView,
ViewGroup parent) {
return getCustomView(position, convertView, parent);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return getCustomView(position, convertView, parent);
}
public View getCustomView(int position, View convertView,
ViewGroup parent) {
LayoutInflater inflater = getLayoutInflater();
View row = inflater.inflate(R.layout.calendar_month_item, parent, false);
TextView label = (TextView) row.findViewById(R.id.calendar_month);
label.setText(calendar_months[position]);
return row;
}
}
}
Dies ist xml, wo ich mein Layout für die Aktivität am definieren (activity_calendar_events.xml):
<?xml version="1.0" encoding="utf-8"?>
<com.android.ui.ActivityHeader
android:id="@+id/header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:gravity="center"
app:actionButtonDrawable="@drawable/icon_add_member_inset"
app:actionButtonDrawableHeight="35dp"
app:actionButtonDrawableWidth="35dp"
app:headerLabel="@string/calendar_events_header"
app:menuButtonDrawable="@drawable/icon_navbar_back_inset"
app:menuButtonDrawableHeight="35dp"
app:menuButtonDrawableWidth="35dp"
app:showMenuButton="true" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#F4F4F4"
android:orientation="horizontal"
android:layout_below="@+id/header" >
<Spinner
android:id="@+id/month_spinner"
android:layout_width="100dp"
android:layout_height="50dp"
android:layout_alignParentLeft="true"
android:layout_marginLeft="20dp"
android:background="#F4F4F4"
android:spinnerMode="dropdown"
android:popupBackground="#F4F4F4"/>
<TextView
android:id="@+id/calendar_year"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginRight="20dp"
android:text="2016" />
</RelativeLayout>
Hier ist die xml, wo ich das Layout für die einzelnen Zeilen des Drop-Down (calendar_month_item.xml) am definieren:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res/com.android.calendar"
android:id="@+id/calendar_month"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="8dp"
android:paddingLeft="15dp"
android:paddingTop="8dp"
android:textColor="#181512"
android:textSize="15sp"
android:textStyle="normal" />
Und schließlich der Logcat Fehler:
04-19 14:27:06.073: E/ThisLife(13008): java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.CharSequence android.widget.TextView.getText()' on a null object reference
04-19 14:27:06.073: E/ThisLife(13008): at com.android.calendar.CalendarEventsActivity$1.onItemSelected(CalendarEventsActivity.java:78)
04-19 14:27:06.073: E/ThisLife(13008): at android.widget.AdapterView.fireOnSelected(AdapterView.java:914)
04-19 14:27:06.073: E/ThisLife(13008): at android.widget.AdapterView.dispatchOnItemSelected(AdapterView.java:903)
04-19 14:27:06.073: E/ThisLife(13008): at android.widget.AdapterView.access$300(AdapterView.java:48)
04-19 14:27:06.073: E/ThisLife(13008): at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:873)
04-19 14:27:06.073: E/ThisLife(13008): at android.os.Handler.handleCallback(Handler.java:739)
04-19 14:27:06.073: E/ThisLife(13008): at android.os.Handler.dispatchMessage(Handler.java:95)
04-19 14:27:06.073: E/ThisLife(13008): at android.os.Looper.loop(Looper.java:135)
04-19 14:27:06.073: E/ThisLife(13008): at android.app.ActivityThread.main(ActivityThread.java:5343)
04-19 14:27:06.073: E/ThisLife(13008): at java.lang.reflect.Method.invoke(Native Method)
04-19 14:27:06.073: E/ThisLife(13008): at java.lang.reflect.Method.invoke(Method.java:372)
04-19 14:27:06.073: E/ThisLife(13008): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)
04-19 14:27:06.073: E/ThisLife(13008): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)
Ich glaube, das ist ein ziemlich Standardmethode zum Schreiben von benutzerdefinierten Spinnereien. Ich habe versucht, mit Haltepunkten zu debuggen und alle Datenpunkte an der bestimmten Zeile, die die NPE verursacht, scheinen nicht Null zu sein. Ich bin mir nicht sicher, was hier los ist. Irgendwelche Vorschläge wären hilfreich.
Danke.
Könnten Sie bitte den gesamten Inhalt der Datei 'calendar_month_item.xml' anzeigen? Sie verweisen auf einen seiner "TextView" in Ihrem Code: "View row = inflater.inflate (R.layout.calendar_month_item, parent, false); TextView-Label = (TextView) row.findViewById (R.id.calendar_month); ' – ishmaelMakitla
Es gab ein Problem mit der Formatierung. Kannst du es jetzt sehen. Die ganze Datei ist da. Enthält nur eine Textansicht. –