Dieser Artikel ist der zweite Teil von "Android-Anwendungsentwicklung: Wie implementieren Sie dies?"
Das Hauptziel ist (willkürlich) die Annahme "Anfänger und Fortgeschrittene, die bald Google gelernt haben" wie ich. Da es sowohl Java als auch Kotlin erklärt, sagen auch diejenigen, die sagen: "Ich verstehe die Implementierung in Java, aber wie schreibt man sie in Kotlin?" Ich denke, es wird nützlich sein.
Die erste war Button Edition.
Ein Beispiel für dieses Projekt finden Sie unter dem folgenden Link. Der Hauptzweig ist der Kotlin-Quellcode und der Java-Zweig ist der Java-Quellcode.
https://github.com/Dai1678/SampleCodePrograms
Es gibt kein Tsukkomi, das Sie bereits zum ersten Mal verwenden. Das ist eine wesentliche Funktion.
Es ist nur langweilig, nur eine Textansicht zu erstellen Als Beispiel
--TextView, die durch langes Drücken des Zeichens kopiert werden kann
Zusätzlich habe ich mit diesen eine Funktion wie ein einfaches Anmeldeformular hinzugefügt.
Android Studio 3.0+ Bestätigter Betrieb unter Android 8.0
build.gradle
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion 27
defaultConfig {
applicationId "net.ddns.dai.samplecodeprograms"
minSdkVersion 17
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
implementation 'com.android.support:appcompat-v7:27.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
implementation 'com.android.support:design:27.1.0'
implementation 'com.android.support:customtabs:27.1.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}
activity_text_sample.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"
android:gravity="center"
android:padding="10dp"
tools:context=".TextSampleActivity">
<TextView
android:id="@+id/userName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Ihr Benutzername ist ◯◯\n Halten Sie zum Kopieren gedrückt"
android:textSize="20sp"
android:textIsSelectable="true"/>
<EditText
android:id="@+id/editPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Bitte legen Sie ein Passwort fest"
android:textSize="20sp"
android:maxLines="1"
android:layout_marginTop="20dp" />
<TextClock
android:id="@+id/currentTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:hint="yyyy/MM/dd HH:mm:ss"
android:textSize="20sp"
android:timeZone="Asia/Tokyo"
android:format12Hour="yyyy/MM/dd HH:mm:ss"
android:format24Hour="yyyy/MM/dd HH:mm:ss"/>
<android.support.design.widget.TextInputLayout
android:id="@+id/nameTextInputLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
app:counterEnabled="true"
app:counterMaxLength="10"
app:errorEnabled="true"
app:hintAnimationEnabled="true"
app:hintEnabled="true">
<android.support.design.widget.TextInputEditText
android:id="@+id/userNameInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Nutzername"
android:maxLines="1"
android:textSize="20sp" />
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:id="@+id/passwordTextInputLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:counterEnabled="false"
app:errorEnabled="false"
app:hintAnimationEnabled="true"
app:hintEnabled="true">
<android.support.design.widget.TextInputEditText
android:id="@+id/userPassWordInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword"
android:hint="Passwort"
android:maxLines="1"
android:textSize="20sp" />
</android.support.design.widget.TextInputLayout>
<Button
android:id="@+id/loginButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="Einloggen"/>
</LinearLayout>
Sie können Zeichen mit <TextView />
anzeigen.
Sie können Zeichen mit <EditText />
eingeben.
<TextClock />
kann das aktuelle Datum und die aktuelle Uhrzeit als formatierte Zeichenfolge anzeigen.
android: format12Hour
und android: format24Hour
können Sie das Format im 12-Stunden-Format bzw. im 24-Stunden-Format einstellen.
In der Stichprobe ist es JJJJ (AD) / MM (Monat) / TT (Tag) HH (Stunde): MM (Minute): SS (Sekunde).Verwenden Sie "
Vergessen Sie bei der Verwendung nicht Implementation'com.android.support: design: (version)
in build.gradle.
Vergessen Sie bei der Verwendung von app: ~ in xml nicht "xmlns: app =" http://schemas.android.com/apk/res-auto "".
--Wenn app: counterEnabled
auf true gesetzt ist, wird die Anzahl der eingegebenen Zeichen in der unteren rechten Ecke angezeigt.
app: counterMaxLength
angeben, können Sie die Zeichenbegrenzung wie 0/10
visualisieren.
(Allein damit können Sie weiter tippen, auch wenn die Anzahl der Zeichen überschritten wird.)
--Wenn app: errorEnabled
auf true gesetzt ist
--Wenn app: pointeEnabled
auf true gesetzt ist, wird die Hinweiszeichenfolge während der Eingabe oben links angezeigt.
--Wenn app: pointeAnimationEnabled
auf true gesetzt ist, wird die Animation auf die Hinweiszeichenfolge angewendet.Ich benutze es oft, wenn es um Zeichen geht, die in TextView oder EditText angezeigt oder eingegeben werden. getText und setText.
example.java
//Da der Rückgabewert von getText vom Typ TextView ist, wird mit toString usw. umgewandelt.(Typkonvertierung)Und ersetzen
String str = textView.getText().toString();
textView.setText("String");
TextInputEditText ist im Grunde die gleiche Verwendung.
Im Beispiel wird die Methode generateUserName verwendet, um eine 10-stellige Zufallszahl zu generieren und den Benutzernamen ohne Erlaubnis zu bestimmen. Legen Sie in EditText mit dem Hinweis "Bitte ein Passwort festlegen" das Passwort mit einer beliebigen Zeichenfolge fest. Wenn die Anmeldeschaltfläche gedrückt wird, wird die Zeichenfolge mit der in TextInputEditText eingegebenen Zeichenfolge verglichen, die die Hinweise "Benutzername" und "Kennwort" enthält.
Ich wollte EditText verwenden, ein Materialdesign, also habe ich versucht, es zu verwenden.
Wenn Sie es zu XML hinzufügen, funktioniert es grundsätzlich ohne Erlaubnis. Auf der Codeseite wird mehr als die in xml angegebene Anzahl von "app: counterMaxLength" eingegeben Eine Fehlermeldung wurde angezeigt.
example.java
userNameInput.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable editable) {
}
@Override
public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
if (charSequence.length() > nameTextInputLayout.getCounterMaxLength()){
nameTextInputLayout.setError("Bitte geben Sie den Benutzernamen innerhalb von 10 Zeichen ein");
}else{
nameTextInputLayout.setError(null);
}
}
});
userNameInput ist das TextInputLayout, in das Sie Ihren Benutzernamen eingeben. Wir haben einen Listener hinzugefügt, um die in TextWatcher eingegebenen Zeichen zu überwachen.
beforeTextChanged(CharSequence charSequence, int start, int count,int after)
--Methode, die unmittelbar vor dem Ändern der Zeichenfolge aufgerufen wird
- CharSequence charSequence
Die aktuell in EditText eingegebene Zeichenfolge
- int start
Startposition der neu hinzugefügten Zeichenfolge in der charSequence-Zeichenfolge
- int count
Gesamtzahl der geänderten Zeichenfolgen in der Zeichenfolge charSequence
- int after
Anzahl der neu hinzugefügten Zeichenfolgen
onTextChanged(CharSequence charSequence, int start, int before, int count)
afterTextChanged(Editable editable)
Verwenden Sie zum Anzeigen der Fehlermeldung die setError-Methode. Wenn nichts angezeigt wird, geben Sie null als Argument an.
Ich habe andere Erklärungen als die, die sich auf Text beziehen, weggelassen, aber das Folgende ist der Quellcode.
TextSampleActivity.java
public class TextSampleActivity extends AppCompatActivity {
private final int NoInput = -2;
private final int LOGIN = 1;
private final int ERROR = -1;
@SuppressLint("SetTextI18n")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_text_sample);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null){
actionBar.setDisplayHomeAsUpEnabled(true);
}
final String name = generateUserName();
TextView userName = findViewById(R.id.userName);
userName.setText("Dein Benutzername ist" + name + "ist\n Halten Sie zum Kopieren gedrückt");
Button loginButton = findViewById(R.id.loginButton);
final EditText editPassWord = findViewById(R.id.editPassword);
final TextInputEditText userNameInput = findViewById(R.id.userNameInput);
final TextInputEditText userPassWordInput = findViewById(R.id.userPassWordInput);
final TextInputLayout nameTextInputLayout = findViewById(R.id.nameTextInputLayout);
loginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String yourPassWord = editPassWord.getText().toString();
String inputUserName = userNameInput.getText().toString();
String inputUserPassWord = userPassWordInput.getText().toString();
if (inputUserName.equals("")){
//Fordern Sie Ihr yourPassWord auf
showResult(view, NoInput);
}else{
boolean loginResult = name.equals(inputUserName) && yourPassWord.equals(inputUserPassWord);
if (loginResult){
//login
showResult(view, LOGIN);
}else{
//error
showResult(view, ERROR);
}
}
}
});
userNameInput.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable editable) {
}
@Override
public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
if (charSequence.length() > nameTextInputLayout.getCounterMaxLength()){
nameTextInputLayout.setError("Bitte geben Sie den Benutzernamen innerhalb von 10 Zeichen ein");
}else{
nameTextInputLayout.setError(null);
}
}
});
}
private String generateUserName(){
final String letters = "abcdefghijklmnopqrstuvwxyz0123456789";
Random random = new Random();
StringBuilder stringBuilder = new StringBuilder();
while (stringBuilder.length() < 10){
int val = random.nextInt(letters.length());
stringBuilder.append(letters.charAt(val));
}
return stringBuilder.toString();
}
@SuppressLint("SimpleDateFormat")
private void showResult(View view, int result){
String showText = "";
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date date = new Date(System.currentTimeMillis());
switch (result){
case NoInput:
showText = "Bitte legen Sie ein Passwort fest";
break;
case LOGIN:
showText = dateFormat.format(date) + "Eingeloggt!";
break;
case ERROR:
showText = "Der eingegebene Benutzername oder das eingegebene Passwort ist falsch";
}
Snackbar.make(view, showText, Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
}
Der Grund, warum die Variablen editPassWord, userNameInput und userPassWordInput den endgültigen Modifikator erhalten mussten, ist Dies soll verhindern, dass der Wert während der Verarbeitung geändert wird, z. B. OnClickListener, der eine anonyme Klasse definiert. Wenn Sie während der Verarbeitung einen Countdown durchführen möchten, können Sie die Elementvariablen der Klasse verwenden.
Die Art und Weise, getText und setText in Kotlin zu schreiben, ist etwas cool.
example.kt
val str = textView.text.toString() //Wird als setText verwendet
textView.text = "String" //Wird als getText verwendet
Sie können beides mit .text tun. Besonders wenn Sie es als getText verwenden, anstatt einen String-Typ als Argument wie Java zu übergeben Es wird in Form einer Substitution ausgedrückt.
Wenn Sie in Kotlin eine Variable in eine Zeichenfolge einbetten möchten, können Sie sie auf natürliche Weise mit $
ausdrücken. Es ist das gleiche wie bei PHP.
example.kt
userName.text = "Dein Benutzername ist${name}ist\n Halten Sie zum Kopieren gedrückt"
//Dies ist in Ordnung, wenn Leerzeichen vor und nach der Variablen eingefügt werden
userName.text = "Dein Benutzername ist$ist Name\n Halten Sie zum Kopieren gedrückt"
Unten finden Sie den Quellcode für die Beispiel-App in Kotlin.
TextSampleActivity.kt
class TextSampleActivity : AppCompatActivity() {
private val noInput = -2
private val login = 1
private val error = -1
@SuppressLint("SetTextI18n")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_text_sample)
val actionBar = supportActionBar
actionBar!!.setDisplayHomeAsUpEnabled(true)
//Erstellen Sie Ihren Namen
val name = generateUserName(10)
userName.text = "Dein Benutzername ist${name}ist\n Halten Sie zum Kopieren gedrückt"
loginButton.setOnClickListener { view ->
val yourPassWord = editPassword.text.toString()
val inputUserName = userNameInput.text.toString()
val inputUserPassWord = userPassWordInput.text.toString()
if (inputUserPassWord == ""){
//Fordern Sie Ihr yourPassWord auf
showResult(view, noInput)
}else{
val loginResult = name == inputUserName && yourPassWord == inputUserPassWord
if (loginResult){
//login
showResult(view, login)
}else{
//error
showResult(view, error)
}
}
}
userNameInput.addTextChangedListener(object: TextWatcher {
override fun beforeTextChanged(charSequence: CharSequence, start: Int, count: Int, after: Int) {}
override fun afterTextChanged(editable: Editable) {}
override fun onTextChanged(charSequence: CharSequence, start: Int, before: Int, count: Int) {
if (charSequence.length > nameTextInputLayout.counterMaxLength) {
nameTextInputLayout.error = "Bitte geben Sie den Benutzernamen innerhalb von 10 Zeichen ein"
} else {
nameTextInputLayout.error = null
}
}
})
}
//Erstellen Sie eine Zufallszahl mit der Anzahl der Ziffern des Argumentwerts
private fun generateUserName(length: Int): String {
val letters = "abcdefghijklmnopqrstuvwxyz0123456789"
var str = ""
while (str.length < length) {
str += letters[Random().nextInt(letters.length)]
}
return str
}
@SuppressLint("SimpleDateFormat")
private fun showResult(view: View, result: Int){
var showText = ""
val dateFormat = SimpleDateFormat("yyyy/MM/dd HH:mm:ss")
val date = Date(System.currentTimeMillis())
when (result) {
noInput -> {
showText = "Bitte legen Sie ein Passwort fest"
}
login -> {
showText = "${dateFormat.format(date)}Sie haben sich angemeldet!"
}
error -> {
showText = "Der eingegebene Benutzername oder das eingegebene Passwort ist falsch"
}
}
Snackbar.make(view, showText, Snackbar.LENGTH_LONG)
.setAction("Action", null).show()
}
}
Ich habe anhand dieses Artikels etwas über TextInputLayout gelernt.
Ich habe es schon oft benutzt, aber über Toast und SnackBar. Vielleicht überspringe ich es und mache etwas anderes ...
Es ist nicht aus Material
Ich würde es gerne Junioren an der Universität zeigen, aber ich wäre dankbar, wenn Qiita-Benutzer Kommentare abgeben könnten, wenn Nachfrage besteht. Wenn Sie Fehler haben, stellen Sie bitte eine Korrekturanfrage.
Recommended Posts