试图从日历中获取日期...应用程序崩溃

Trying to get date from Calendar... app crashes

我想要什么?:写一个方法给:

我做了什么:

private void setToday() {
    String dateToday = "";
    DateFormat df = new SimpleDateFormat("dd MM yyyy, HH:mm");
    dateToday = df.format(Calendar.getInstance().getTime());
    EditText title = (EditText) findViewById(R.id.Title);
    dateToday = df.toString();
    title.setText(dateToday);
}

还有:

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;

编辑文本和按钮:

 <EditText
            android:id="@+id/Title"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:hint="Title" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="Today"
            android:onClick="setToday"/>

What should it do?: 在 Utopia 中,这应该获取日期,关注 EditText 并将日期放入 EditText。

它有什么作用?:单击按钮 = 应用程序崩溃。

这是一个全新的应用程序。我什至只试过:

private void setToday() {
        EditText title = (EditText) findViewById(R.id.Title);
        title.setText("HOY");
    }

它仍然崩溃。我做错了什么,但无法弄清楚它是什么。

编辑:我设法找到了 logcat:

FATAL EXCEPTION: main
java.lang.IllegalStateException: Could not find method setToday(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.support.v7.widget.AppCompatButton

at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.resolveMethod(AppCompatViewInflater.java:327)

at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:284)

at android.view.View.performClick(View.java:4232)

at android.view.View$PerformClick.run(View.java:17298)

at android.os.Handler.handleCallback(Handler.java:615)

at android.os.Handler.dispatchMessage(Handler.java:92)

at android.os.Looper.loop(Looper.java:137)

at android.app.ActivityThread.main(ActivityThread.java:4921)

at java.lang.reflect.Method.invokeNative(Native Method)

at java.lang.reflect.Method.invoke(Method.java:511)

at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)

at dalvik.system.NativeStart.main(Native Method)

感谢您的帮助。

PS:这是我的全部代码:

Java

package com.example.android.notastxt;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.EditText;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    private void setToday() {
        String dateToday = "HOY";
        DateFormat df = new SimpleDateFormat("dd MM yyyy, HH:mm");
        dateToday = df.format(Calendar.getInstance().getTime());
        EditText title = (EditText) findViewById(R.id.Title);
        dateToday = df.toString();
        title.setText(dateToday);
    }

}

xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context="com.example.android.notastxt.MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <EditText
            android:id="@+id/Title"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:hint="Title" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="Today"
            android:onClick="setToday"/>
    </LinearLayout>

    <EditText
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:gravity="start"
        android:hint="Write" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Save" />


</LinearLayout>

只谈你的约会工作……

格式化程序的描述?!

您的代码:

String dateToday = "";
DateFormat df = new SimpleDateFormat("dd MM yyyy, HH:mm");
dateToday = df.format(Calendar.getInstance().getTime());  // <-- Good, you have your string representing date-time value. But then you replace it two lines below.
EditText title = (EditText) findViewById(R.id.Title);
dateToday = df.toString();  // <-- Why ask for a description of the formatter?
title.setText(dateToday);

…正在用格式化程序的描述替换您想要的日期时间字符串。应该是:

DateFormat df = new SimpleDateFormat("dd MM yyyy, HH:mm");
String dateToday = df.format(Calendar.getInstance().getTime());
EditText title = (EditText) findViewById(R.id.Title);
title.setText(dateToday);

使用java.time

更好的是,停止使用这些麻烦的旧日期时间 类。它们现在是遗留的,被 java.time 类 取代。对于 Android,请参阅下面的最后一个项目符号。

InstantUTC 时间轴上的一个时刻。它取代了 java.util.Date,但具有纳秒而不是毫秒的更精细分辨率。

Instant instant = Instant.now() ; 

应用您要查看挂钟时间的时区。对于任何给定的时刻,日期和一天中的时间都因区域而异。 Europe/Paris 的中午在 Asia/Kolkata 的时间要晚得多,而在 America/Montreal 的时间要早​​得多。

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

让java.time自动本地化。

Locale locale = Locale.CANADA_FRENCH ;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.LONG ).withLocale( locale ) ;
String output = zdt.format( f ) ;

或指定自定义图案。

Locale locale = Locale.US ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd MM uuuu, HH:mm" , locale ) ;
String output = zdt.format( f ) ;

关于java.time

java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

Joda-Time project, now in maintenance mode, advises migration to the java.time 类.

要了解更多信息,请参阅 Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310

在哪里获取java.time类?

我值得你所有的笑。这只是新手的错误。

已更改

private void setToday() {

对于

public void setToday(View View) {

瞧! 完美无缺。

我使用了来自@Basil Bourque 的代码:

DateFormat df = new SimpleDateFormat("dd MM yyyy, HH:mm");
String dateToday = df.format(Calendar.getInstance().getTime());
EditText title = (EditText) findViewById(R.id.Title);
title.setText(dateToday);

谢谢你,罗勒。

问题已解决。