由于复活节假期临近,我决定通过编写一个Android应用程序来开发我的Android技能,该应用程序计算西方和复活节日历的日期。
这些公式是从互联网上得到的。这是一个简单的应用程序,您输入年份,在TextView中获取两个日历的日期,我使用EditText作为标签,使它们不可点击,当日期可见时出现,当日期不显示时隐藏起来。
我没有任何专业或实习经验。任何输入都会有帮助。它是在Android 4.1.2上构建和编译的,并在我的设备上运行。
以下是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/textView"
android:layout_width="459dp"
android:layout_height="56dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:text="@string/welcome"
android:textSize="22sp"
app:layout_constraintBottom_toTopOf="@+id/editTextDate"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
android:gravity="center"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/editTextDate"
android:layout_width="wrap_content"
android:layout_height="46dp"
android:layout_marginTop="16dp"
android:ems="10"
android:gravity="center"
android:maxLength="4"
android:digits="0123456789"
android:inputType="date"
android:textSize="22sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView" />
<TextView
android:id="@+id/textViewWestern"
android:layout_width="150dp"
android:layout_height="48dp"
android:layout_marginTop="60dp"
android:gravity="center"
android:text=""
android:textSize="22sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.045"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/editTextDate" />
<TextView
android:id="@+id/textViewEastern"
android:layout_width="150dp"
android:layout_height="48dp"
android:layout_marginTop="60dp"
android:gravity="center"
android:text=""
android:textSize="22sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.969"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/editTextDate" />
<EditText
android:id="@+id/western"
android:layout_width="150dp"
android:layout_height="44dp"
android:layout_marginStart="12dp"
android:layout_marginTop="16dp"
android:ems="10"
android:focusable="false"
android:focusableInTouchMode="false"
android:gravity="center"
android:inputType="textPersonName"
android:background="@android:color/transparent"
android:text="Western"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/editTextDate" />
<EditText
android:id="@+id/eastern"
android:layout_width="150dp"
android:layout_height="44dp"
android:layout_marginTop="16dp"
android:ems="10"
android:focusable="false"
android:focusableInTouchMode="false"
android:inputType="textPersonName"
android:text="Eastern"
android:background="@android:color/transparent"
android:gravity="center"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.969"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/editTextDate" />
</androidx.constraintlayout.widget.ConstraintLayout> MainActivity.java代码。
package com.example.easterdate;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.Gravity;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EditText Edit = findViewById(R.id.editTextDate);
final TextView text = findViewById(R.id.textViewWestern);
final TextView textEastern = findViewById(R.id.textViewEastern);
final EditText eastern = findViewById(R.id.eastern);
final EditText western = findViewById(R.id.western);
eastern.setVisibility(View.INVISIBLE);
western.setVisibility(View.INVISIBLE);
Edit.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s.toString().trim().length() == 0 || Integer.parseInt(s.toString()) < 1800) {
text.setText("");
textEastern.setText("");
eastern.setVisibility(View.INVISIBLE);
western.setVisibility(View.INVISIBLE);
return;
}
EditText Edit = findViewById(R.id.editTextDate);
int AN = Integer.parseInt(Edit.getText().toString());
int G = AN % 19;
int C = AN / 100;
int H = (C - C / 4 - (8 * C + 13) / 25 + 19 * G + 15) % 30;
int I = H - (H / 28) * (1 - (H / 28) * (29 / (H + 1)) * ((21 - G) / 11));
int J = (AN + AN / 4 + I + 2 - C + C / 4) % 7;
int L = I - J;
int MP = 3 + (L + 40) / 44;
int JP = L + 28 - 31 * (MP / 4);
int mon, day;
int A = AN % 19;
int b = AN % 7;
int ce = AN % 4;
int d = (19 * A + 16) % 30;
int e = (2 * ce + 4 * b + 6 * d) % 7;
int f = (19 * A + 16) % 30;
int key = f + e + 3;
if (key > 30)
mon = 5;
else
mon = 4;
if (key > 30)
day = key - 30;
else day = key;
String[] month = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
eastern.setVisibility(View.VISIBLE);
western.setVisibility(View.VISIBLE);
text.setText("Sunday " + JP + " " + month[MP - 1]);
textEastern.setText("Sunday " + day + " " + month[mon - 1]);
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
}这代码有多专业?我应该使用函数而不是命令式编程吗?TextWatcher用于防止应用程序崩溃,并在输入中显示日期,还有更好的解决方案吗?
发布于 2021-02-19 20:24:15
小评论
这代码有多专业?
复活节的日期是不容易辨认和依靠一些神秘的计算。“这些公式是从互联网上得到的。”是没有足够的文件。在您必须修复或扩展这段代码之后,考虑一下程序员。最好在代码中包括更多的细节--至少有一个URL或者引用到源算法。下面是示例。我不确定OP的消息来源。
Anonymous Gregorian algorithm: Meeus/Jones/Butcher
Dates of Easter
Astronomical Algorithms 1991
Jean Meeus
https://en.wikipedia.org/wiki/Computus#Anonymous_Gregorian_algorithm
Meeus's Julian algorithm
https://en.wikipedia.org/wiki/Computus#Meeus's_Julian_algorithm代码应该记录其有效年份的范围。
中的精度
“.计算西方和复活节日历的日期。”
说到“西方”,我怀疑你是指公历。
所谓“复活节”,我怀疑你指的是“东方”或朱利安历法。
https://codereview.stackexchange.com/questions/256241
复制相似问题