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

时间:2017-09-25 22:46:37

标签: java android string date settext

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

  • 第一:获取日期。

  • 第二:将其设为字符串。

  • 3rd :将setText(String)转换为EditText。

我做了什么

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&按钮

 <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"/>

它应该做什么?:在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:这是我的所有代码:

爪哇

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>

2 个答案:

答案 0 :(得分:3)

只谈你的日期工作......

格式化程序的描述?!

您的代码:

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框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

答案 1 :(得分:1)

我应该得到你所有的笑声。这只是新手的错误。

更改

private void setToday() {

有关

public void setToday(View View) {

Voilà!它完美无瑕。

我使用了来自@Basil Bourque的代码:https://stackoverflow.com/a/46415908/8662218

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);

谢谢你,巴兹尔。

问题解决了。