Android 尝试在CustomSpinner中访问TextView时出现NullPointerException
我正在尝试为日历视图使用自定义微调器。我已经编写了自己的自定义适配器。视图最初加载很好,但当我尝试单击微调器下拉列表中的一个项目时,应用程序崩溃 以下是我的活动代码:Android 尝试在CustomSpinner中访问TextView时出现NullPointerException,android,android-layout,nullpointerexception,android-spinner,android-custom-view,Android,Android Layout,Nullpointerexception,Android Spinner,Android Custom View,我正在尝试为日历视图使用自定义微调器。我已经编写了自己的自定义适配器。视图最初加载很好,但当我尝试单击微调器下拉列表中的一个项目时,应用程序崩溃 以下是我的活动代码: public class CalendarEventsActivity extends Activity { protected ActivityHeader mHeader; private Spinner mMonthDropdown; @Override protected void beforeMainContent
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;
}
}
}
我相信这是编写自定义微调器的一种非常标准的方法。我试着用断点和特定行上的所有数据点进行调试,导致NPE似乎不为空。我真的不确定这里发生了什么。任何建议都会有帮助
谢谢。文本视图的id是日历年,而在代码中,您引用了日历月
<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);
TextView标签=(TextView)row.findViewById(R.id.calendar\u month);
设置适配器时,不要传递此
,而是尝试日历事件活动。此
。所以它看起来像:mMonthDropdown.setAdapter(新的MyAdapter(CalendarEventsActivity.this,R.layout.calendar\u month\u item,items))代码>更改行
System.out.println("you have now clicked......."+((TextView)parent.getChildAt(position)).getText().toString());
到
请记住,根据您的适配器,无论何时请求视图,getCustomView函数都会返回一个“充气的”R.layout.calendar\u month\u项。然后在此视图中查找R.id.calendar\u month
,其中应包含所选月份的值。请检查并确认这是否有效。希望如此。您能显示整个日历\u月\u item.xml
文件内容吗?您正在代码中引用其TextView
之一:`View行=充气机.inflate(R.layout.calendar\u month\u项,父项,false);TextView标签=(TextView)row.findViewById(R.id.calendar\u month)代码>格式有问题。你现在能看到吗。整个档案都在那里。只包含一个文本视图。抱歉。我想我加错了。它的日历月在这两个地方都出现了,但仍然崩溃。而且,textview(日历年)与微调器textview(日历月)不同且独立。尝试了。仍然崩溃。这很有道理,而且确实有效:)谢谢。我应该早点看视图元素。
<?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" />
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)
<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);
System.out.println("you have now clicked......."+((TextView)parent.getChildAt(position)).getText().toString());
String selectedMonth = ((TextView) view.findViewById(R.id.calendar_month)).getText().toString();
System.out.println("you have now clicked......."+selectedMonth);