DatePicker onDateSet 方法未运行

问题描述

我是 android studio 的完全初学者,我正在按照本教程从 DatePicker 小部件在我的应用中插入日期。 https://www.youtube.com/watch?v=33BFCdL0Di0

功能存在于我拥有的片段中,而不存在于我的 MainActivity 中。问题是当我点击日历上的日期时 onDateSet 方法没有运行。

我的代码

DatePickerFragment.java

public class DatePickerFragment extends DialogFragment {

    Calendar c = Calendar.getInstance();
    int year = c.get(Calendar.YEAR);
    int month = c.get(Calendar.MONTH);
    int day = c.get(Calendar.DAY_OF_MONTH);

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState){
       return new DatePickerDialog(getContext(),(DatePickerDialog.OnDateSetListener) getView(),year,month,day);

    }

}

StatisticsFragment.java //我插入日期的地方

public class StatisticsFragment extends Fragment implements DatePickerDialog.OnDateSetListener{

    private FragmentStatisticsBinding binding;
    private View root;
    public View onCreateView(@NonNull LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {

        binding = FragmentStatisticsBinding.inflate(inflater,container,false);
         root = binding.getRoot();

        EditText fromInput = (EditText) root.findViewById(R.id.inputFrom);
        fromInput.setonClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DialogFragment datePicker = new DatePickerFragment();
                datePicker.show(requireActivity().getSupportFragmentManager(),"date picker");

            }
        });

        return root;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        binding = null;
    }

    @Override
    public void onDateSet(DatePicker view,int year,int month,int dayOfMonth){
        System.out.println("I am in ");    // does not enter
        Calendar c = Calendar.getInstance();
        c.set(Calendar.YEAR,year);
        c.set(Calendar.MONTH,month);
        c.set(Calendar.DAY_OF_MONTH,dayOfMonth);
        String currentDateString = DateFormat.getDateInstance(DateFormat.FULL).format(c.getTime());

        TextView fromText =  root.findViewById(R.id.from);
        fromText.setText(currentDateString);
    }
}

frament_statistics.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <TextView
        android:id="@+id/from"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="44dp"
        android:layout_marginTop="56dp"
        android:text="From :"
        android:textSize="20sp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/viewStats" />




    <EditText
        android:id="@+id/inputTo"
        android:layout_width="150dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="36dp"
        android:layout_marginTop="16dp"
        android:hint="Enter date"
        android:textAlignment="center"
        android:textSize="20sp"
        app:layout_constraintStart_toEndOf="@+id/inputFrom"
        app:layout_constraintTop_toBottomOf="@+id/to" />

    <TextView
        android:id="@+id/viewStats"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="40dp"
        android:layout_marginTop="64dp"
        android:text="View vaccination statistics for specific dates : "

        android:textSize="17sp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

非常感谢您的帮助

解决方法

您尚未将 DatePickerStatisticsFragment OnDateSetListener 连接在一起。

(DatePickerDialog.OnDateSetListener) getView()

在这个生命周期阶段,DialogFragment 没有视图,getView() 返回 null。 null 可以转换为任何类型,因此这里也不例外。将 null 作为侦听器传递意味着没有侦听器。

您可以去掉 DatePickerFragment,直接在 SettingsFragment 中启动日期选择器,将 this 作为侦听器。

DatePickerDialogAlertDialog,因此您会失去 DialogFragment 的一些好处,例如配置更改支持。)

,

我稍微修改了您的代码并使其正常工作。 请通过它。

StatisticsFragment.java

import android.app.DatePickerDialog;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.DatePicker;
import androidx.annotation.NonNull;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.Fragment;
import java.text.DateFormat;
import java.util.Calendar;

public class StatisticsFragment extends Fragment implements DatePickerDialog.OnDateSetListener {

private FragmentStatisticsBinding binding;
private View root;

public View onCreateView(@NonNull LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {

    binding = FragmentStatisticsBinding.inflate(inflater,container,false);
    root = binding.getRoot();

    binding.inputTo.setOnClickListener(v -> {
        DialogFragment datePicker = new DatePickerFragment(StatisticsFragment.this);
        datePicker.show(requireActivity().getSupportFragmentManager(),"date picker");
    });

    return root;
}

@Override
public void onDestroyView() {
    super.onDestroyView();
    binding = null;
}

@Override
public void onDateSet(DatePicker view,int year,int month,int dayOfMonth) {
    System.out.println("I am in ");    // does not enter
    Calendar c = Calendar.getInstance();
    c.set(Calendar.YEAR,year);
    c.set(Calendar.MONTH,month);
    c.set(Calendar.DAY_OF_MONTH,dayOfMonth);
    String currentDateString = DateFormat.getDateInstance(DateFormat.FULL).format(c.getTime());

    binding.from.setText("From : " + currentDateString);
}
}

DatePickerFragment.java

import android.app.DatePickerDialog;
import android.app.Dialog;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.fragment.app.DialogFragment;
import java.util.Calendar;

public class DatePickerFragment extends DialogFragment {

Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
DatePickerDialog.OnDateSetListener listener;

public DatePickerFragment(DatePickerDialog.OnDateSetListener listener) {
    this.listener = listener;
}

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    return new DatePickerDialog(getContext(),listener,year,month,day);
}
}

fragment_statistics.xml

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/holo_orange_light">

    <TextView
        android:id="@+id/from"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="44dp"
        android:layout_marginTop="56dp"
        android:text="From :"
        android:textSize="20sp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/viewStats" />


    <EditText
        android:id="@+id/inputTo"
        android:layout_width="150dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="36dp"
        android:layout_marginTop="16dp"
        android:focusable="false"
        android:hint="Select date"
        android:textAlignment="center"
        android:textSize="20sp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/from" />

    <TextView
        android:id="@+id/viewStats"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="40dp"
        android:layout_marginTop="64dp"
        android:text="View vaccination statistics for specific dates : "
        android:textSize="17sp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

希望这会有所帮助。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...