Entwicklung von Android-Anwendungen (sowohl Java- als auch Kotlin-kompatibel) Wie implementieren Sie dies? ~ Textausgabe ~

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

Ich habe versucht, verschiedene Texte zu verwenden

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.

Umgebung

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'
}

Betriebsdemo

TextSampleActivity.gif

Erklärung von XML

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.

Verwenden Sie "" und "" als Satz (wenn Sie zwei Eingabefelder vorbereiten, bereiten Sie jeweils zwei vor). Sie können dies verwenden, um EditText mit Materialdesign-Animationen zu implementieren.

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.

Erklärung der Aktivität

Java Edition

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.

Informationen zu TextInputLayout und TextInputEditText

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.

Kotlin Ausgabe

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

    }
}

Referenz

Ich habe anhand dieses Artikels etwas über TextInputLayout gelernt.

Vorschau beim nächsten Mal

Ich habe es schon oft benutzt, aber über Toast und SnackBar. Vielleicht überspringe ich es und mache etwas anderes ...

Es ist nicht aus Material

Nachwort

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

Entwicklung von Android-Anwendungen (sowohl Java- als auch Kotlin-kompatibel) Wie implementieren Sie dies? ~ Textausgabe ~
Entwicklung von Android-Anwendungen (sowohl Java- als auch Kotlin-kompatibel) Wie implementieren Sie dies? ~ Button Edition ~
Zusammenfassung der guten Punkte und Vorsichtsmaßnahmen bei der Konvertierung der Java Android-Anwendung in Kotlin