-1

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.

+0

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

+0

Es gab ein Problem mit der Formatierung. Kannst du es jetzt sehen. Die ganze Datei ist da. Enthält nur eine Textansicht. –

Antwort

1

Ändern Sie die Zeile

System.out.println("you have now clicked......."+((TextView)parent.getChildAt(position)).getText().toString()); 

Um

String selectedMonth = ((TextView) view.findViewById(R.id.calendar_month)).getText().toString(); 
System.out.println("you have now clicked......."+selectedMonth); 

Denken Sie daran, dass nach Ihrem Adapter, die getCustomView Funktion gibt ein "aufgeblasen" R.layout.calendar_month_item, wenn ein Ansicht wird angefordert. Dann suchen Sie in dieser Ansicht nach R.id.calendar_month - die den Wert des ausgewählten Monats enthalten sollte. Bitte überprüfen und bestätigen, ob das funktioniert. Ich hoffe es tut es.

+0

Das macht vollkommen Sinn und hat funktioniert :) Danke. Ich hätte früher auf das View-Element schauen sollen. –

+0

Akzeptiert und +1 –

+0

Froh, zu helfen, danke! – ishmaelMakitla

-1

Die ID des Textview calendar_year ist, während in Ihrem Code Sie calendar_month

<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" /> 

TextView label = (TextView) row.findViewById(R.id.calendar_month); 
+0

Entschuldigung. Ich denke, ich habe es falsch gemacht. Sein Kalendermonat an beiden Orten und immer noch abstürzt. –

+0

Auch diese Textansicht (calendar_year) ist unterschiedlich und unabhängig von der Spinner Textansicht (calendar_month). –

0

verwiesen haben, wenn Sie Adapter setzen, statt this zugeben, versuchen CalendarEventsActivity.this. Also, es wird wie folgt aussehen:
mMonthDropdown.setAdapter(new MyAdapter(CalendarEventsActivity.this, R.layout.calendar_month_item, items));

+0

Versuchte das. Stürzt immer noch ab. –