【问题标题】:Why app keeps crashing after button click to show datepicker为什么单击按钮以显示日期选择器后应用程序不断崩溃
【发布时间】: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 等等

标签: java android


【解决方案1】:

试试这个:

移动这个: btnDeparture = (Button)rootView.findViewById(R.id.btnDepartureDate);

inflate 后到 onCreateView() { ...}

对于 onClick 试试这个:

 public void showDialogOnButtonClick(){
        btnDeparture.setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        view.getContext().showDialog(DIALOG_ID);
                    }
                }
        );
    }

试试看。

【讨论】:

  • 无法解析方法'showDialog(int) 出现错误
  • 啊,我想你混合了 Fragment 有对话框和 DialogFragment。试试这个链接,stackoverflow.com/questions/12818342/…。它会说,您必须定义一个 showDialog。如果没记错的话,我没有在您的代码中看到它的定义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-04
  • 1970-01-01
  • 2019-12-04
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 2017-02-14
相关资源
最近更新 更多