【发布时间】:2016-08-19 14:28:13
【问题描述】:
所以这个想法是允许用户点击一个按钮(或文本视图),显示一个日期选择器,选择一个日期,将日期保存到数据库(在 TODO 列表上)并通过 toast 向用户(或者如果我走那条路线,则在文本视图上)。所有这些都在一个选项卡式活动的片段上
现在我只使用了一个按钮,当我单击它时,应用程序就会崩溃。目录显示以下内容
08-19 09:50:57.422 21472-21472/com.example.alibasmaci.maralapplication E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.alibasmaci.maralapplication, PID: 21472
java.lang.NullPointerException
at com.example.alibasmaci.maralapplication.OneWayFragment.showDialogOnButtonClick(OneWayFragment.java:49)
at com.example.alibasmaci.maralapplication.OneWayFragment.onCreateView(OneWayFragment.java:93)
现在有问题的 java 类在这里:
package com.example.alibasmaci.maralapplication;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;
/**
* A simple {@link Fragment} subclass.
*/
public class OneWayFragment extends Fragment {
Spinner spinDeparture;
Spinner spinDestination;
Button btnDeparture;
EditText etDepartureDate;
int year_x, month_x, day_x;
static final int DIALOG_ID = 0;
String[] cities = {
"Ottawa",
"Montreal",
"Toronto"
};
public static OneWayFragment newInstance() {
OneWayFragment fragment = new OneWayFragment();
return fragment;
}
public OneWayFragment() {
// Required empty public constructor
}
public void showDialogOnButtonClick(){
btnDeparture = (Button)getActivity().findViewById(R.id.btnDepartureDate);
btnDeparture.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View view) {
getActivity().showDialog(DIALOG_ID);
}
}
);
}
protected Dialog onCreateDialog(int id){
if (id == DIALOG_ID)
return new DatePickerDialog(getActivity(),dPickerListener, year_x, month_x, day_x);
return null;
}
private DatePickerDialog.OnDateSetListener dPickerListener = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker datePicker, int year, int monthOfYear, int dayOfMonth) {
year_x = year;
month_x = monthOfYear;
day_x = dayOfMonth;
Toast.makeText(getActivity(), year_x+"/"+month_x+"/"+day_x,Toast.LENGTH_LONG).show();
}
};
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View rootView = inflater.inflate(R.layout.fragment_one_way, container, false);
// Spinner to display departure points
spinDeparture = (Spinner) rootView.findViewById(R.id.spinnerDeparture);
ArrayAdapter adapterDeparture = new ArrayAdapter(getActivity(),android.R.layout.simple_spinner_item,cities);
spinDeparture.setAdapter(adapterDeparture);
// Spinner to display destinations
spinDestination = (Spinner) rootView.findViewById(R.id.spinnerDestination);
ArrayAdapter adapterDestination = new ArrayAdapter(getActivity(),android.R.layout.simple_spinner_item,cities);
spinDeparture.setAdapter(adapterDestination);
// Show date picker when departure button is clicked
showDialogOnButtonClick();
return rootView;
}
}
错误所指的行在这里:
public void showDialogOnButtonClick() {
对为什么会崩溃有什么想法吗?
【问题讨论】:
-
您的片段是否附加到任何活动?请发布确切的崩溃行。
-
是的,在我添加与日期选择器相关的代码之前,选项卡式活动能够在两个不同的片段之间滑动。根据 logcat 的确切行是我之前显示的第 49 行。它还显示和错误在第 93 行调用该方法 // 单击出发按钮时显示日期选择器 showDialogOnButtonClick();
-
Offtop:为什么你的片段设置点击监听器在活动中的按钮?这很奇怪。
-
我提到的教程是在一个活动中使用日期选择器,我试图修改它以在片段中使用,由于我不擅长这个我相信有很多奇怪的错误
-
getActivity()在onCreateView()方法中返回 null。答案在这里:stackoverflow.com/a/6225044/436938 和这里 stackoverflow.com/a/31237093/436938 等等