当前位置: 首页 > 知识库问答 >
问题:

我的代码不适用于在多个文本视图中设置日期

宗增
2023-03-14

我试图显示不同的日期在不同的TextViews在一个片断中的答案后,MH在TimePicker onTimeSet上对这个问题的回答没有被调用,但我没有得到相同的结果为一个片断。

public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {
    private int mId;
    DatePickerDialogListener mListener;
    protected static DatePickerFragment newInstance(int id) {
        Bundle args = new Bundle();
        args.putInt("picker_id", id);
        DatePickerFragment fragment = new DatePickerFragment();
        fragment.setArguments(args);
        return fragment;
    }
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // ... omitted
        final Calendar c = Calendar.getInstance();
        int mDay = c.get(Calendar.DAY_OF_MONTH);
        int mMonth = c.get(Calendar.MONTH);
        int mYear = c.get(Calendar.YEAR);
        mId = getArguments().getInt("picker_id");
        mListener = getActivity() instanceof DatePickerFragment.DatePickerDialogListener ? (DatePickerFragment.DatePickerDialogListener) getActivity() : null;
        // Create a new instance of TimePickerDialog and return it
        return new DatePickerDialog(getActivity(), this, mYear, mMonth, mDay);
    }
    @Override
    public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
        if (mListener != null) mListener.onDateSet(mId, view, year, month, dayOfMonth);
    }
    public static interface DatePickerDialogListener {
        public void onDateSet(int id, DatePicker view, int year, int month, int dayOfMonth);
    }
}

将使用此datepickerdialog的片段类药物具有以下代码:

public class Medication extends Fragment implements DatePickerFragment.DatePickerDialogListener {
    private static final int FIRST_VISIT_ID = 1;
    private static final int SECOND_VISIT_ID = 2;
    private static final int THIRD_VISIT_ID = 3;
    private int mYear;
    private int mMonth;
    private int mDay;
    protected static TextView date1;
    protected static TextView date2;
    protected static TextView date3;
    public Medication() {
        // Required empty public constructor
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_medication, container, false);
        final Calendar c = Calendar.getInstance();
        mYear = c.get(Calendar.YEAR);
        mMonth = c.get(Calendar.MONTH);
        mDay = c.get(Calendar.DAY_OF_MONTH);
        date1 =(TextView) view.findViewById(R.id.visit_date1);
        date2 =(TextView) view.findViewById(R.id.visit_date2);
        date3 =(TextView) view.findViewById(R.id.visit_date3);
        date1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DialogFragment newFragment = DatePickerFragment.newInstance(FIRST_VISIT_ID);
                newFragment.show(getFragmentManager(), "timePicker");
            }
        });
        date2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DialogFragment newFragment = DatePickerFragment.newInstance(SECOND_VISIT_ID);
                newFragment.show(getFragmentManager(), "timePicker");
            }
        });
        date3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DialogFragment newFragment = DatePickerFragment.newInstance(THIRD_VISIT_ID);
                newFragment.show(getFragmentManager(), "timePicker");
            }
        });
        date1.setText(
            new StringBuilder()
            // Month is 0 based so add 1
            .append(mDay).append("/")
            .append(mMonth + 1).append("/")
            .append(mYear).append(" "));
        date2.setText(
            new StringBuilder()
            // Month is 0 based so add 1
            .append(mDay).append("/")
            .append(mMonth + 1).append("/")
            .append(mYear).append(" "));
        date3.setText(
            new StringBuilder()
            // Month is 0 based so add 1
            .append(mDay).append("/")
            .append(mMonth + 1).append("/")
            .append(mYear).append(" "));
        return view;
    }
    @Override
    public void onDateSet(int id, DatePicker view, int year, int month, int dayOfMonth) {
        Log.i("DatePicker", "Date picker set from id " + id + "!");
        if(id == FIRST_VISIT_ID)
        {
            this.date1.setText(
            new StringBuilder()
            // Month is 0 based so add 1
            .append(dayOfMonth).append("/")
            .append(month + 1).append("/")
            .append(year).append(" "));
        }
        if(id == SECOND_VISIT_ID)
        {
            this.date2.setText(
            new StringBuilder()
            // Month is 0 based so add 1
            .append(dayOfMonth).append("/")
            .append(month + 1).append("/")
            .append(year).append(" "));
        }
        if(id == THIRD_VISIT_ID)
        {
            this.date3.setText(
            new StringBuilder()
            // Month is 0 based so add 1
            .append(dayOfMonth).append("/")
            .append(month + 1).append("/")
            .append(year).append(" "));
        }
    }
}

我也尝试过为Time Picker对话框添加多个Picker的方法,但出现了相同的问题,即Pharming类中的onTimeSet方法没有像这里的OnDateSet那样被调用。

问题是,当我单击textView时,对话框会打开,但在我更改日期后,该textView的日期不会更改。此外,由于未调用onDateSet方法,因此不会显示日志信息消息。也许在这种情况下mListener是空的,我只能猜测。请帮我解决这个问题。提前谢了。

共有1个答案

卜勇
2023-03-14

尝试在片段的onDateSet中添加一些日志,以查看在那里设置了哪些值,以及它是否调用了侦听器。

@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
    Log.i("Fragment/onDateSet", "Date picker set from id " + mId+ "!");
    if (mListener != null) 
        mListener.onDateSet(mId, view, year, month, dayOfMonth);
    else
        Log.w("Fragment/onDateSet", "But no listener available!");    
}

并尝试为不同的片段放置不同的标记,因为现在您正在用相同的标记来标记它们

    newFragment.show(getFragmentManager(), "timePicker2"); 
 类似资料:
  • 我遇到的情况是,当我在每个edittext视图中单击时,需要用日期填充动态呈现的多个编辑文本(edittext视图是以编程方式呈现的)。我不知道需要多少编辑文本,因此不能在布局XML文件中硬编码它们。 尽管我能够正确地呈现视图,但当我试图在一个edittext上设置日期时,该值总是在组中的最后一个edittext上设置。我不知道如何发送一个唯一的id来标识选定的edittext,以便正确设置日期。

  • Android BottomNavigationView图标/文本菜单项不适合某些设备(共4项)。在nexus 5 emulator上,必须旋转才能显示所有项目。无论是从纵向视图还是横向视图开始,图标仅在设备旋转时显示(例如,请参见下面的图像) 我试过一些我可以测试的物理设备,它在所有这些设备上都能正常工作(无论大小),我相信根据测试仪,它对三星S7/8也不起作用,但无法证实这一点。 在肖像中打开

  • 问题是:我还没有找到一个有效的解决方案,允许我在我的recyclerview适配器中使用 我知道我的选择似乎要么是实现一个接口,要么是使用lambda,然而我一直在尝试我能找到的一切,但没有一个是有效的。 我在以下地方尝试过解决方案: 项目Onclick RecyclerView Kotlin Android 科特林的RecyclerView onClick 如何将点击监听器添加到我的回收器视图(

  • 我在动态应用程序中使用片段,其中User.java文件包含值,而< code>TabbedActivity.java文件包含三个片段。我想将文本设置为< code > profile rgament . Java 中的< code>TextView。因此,我在< code > fragment _ profile . XML 中创建了一个< code>TextView,并使用以下代码从< code

  • 问题内容: 在android中,我正在使用默认的CalendarView。我将背景设置为浅灰色。但是我可以更改日历视图的月视图的颜色吗? 问题答案: 正如您所发现的,TextView是私有的,似乎没有任何访问它的方法。 尽管我不推荐这样做,但是您可以使用以下程序包来完成此操作:

  • 在android中,我使用的是默认的日历视图。我已将背景设置为浅灰色。但是我可以改变日历视图的月份视图的颜色吗?