63074
## 実現したいこと

KotlinでFirebase Authenticationを使ったログイン機能を実装しようとしています。

「[初心者がKotlinとFirebase
Authenticationでログイン機能をつくってみた」](https://qiita.com/Natsukii/items/d3b3df974cdfb3c91336)という記事に記載されていたコードを実行しようとしています。

## 問題・エラー

```

    Android resource linking failed
    
```

というメッセージがビルドすると表示されます。

また、`activity_main.xml`の以下の箇所には、`Cannot resolve symbol`と吹き出しで表示されます。

```

    android:text="@string/signup"
    android:text="@string/login"
    android:text="@string/e_mail"
    android:text="@string/password"
    
```

## 実行しているコード

MainActivity.kt

```

    package com.example.loginfunc
    
    import androidx.appcompat.app.AppCompatActivity
    import android.os.Bundle
    import android.widget.Button
    import android.widget.EditText
    import android.widget.Toast
    import com.google.firebase.auth.FirebaseAuth
    
    
    class MainActivity : AppCompatActivity() {
    
        private lateinit var auth: FirebaseAuth
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            auth = FirebaseAuth.getInstance()
    
            val buttonSignUp = findViewById<Button>(R.id.SignUpButton)
            val buttonLogin = findViewById<Button>(R.id.LoginButton)
    
    
    
            buttonSignUp.setOnClickListener {
    
                val emailEditText = findViewById<EditText>(R.id.emailEditText)
                val emailText = emailEditText.text.toString()
    
                val passEditText = findViewById<EditText>(R.id.passEditText)
                val passText = passEditText.text.toString()
    
    
                auth.createUserWithEmailAndPassword(emailText, passText)
                    .addOnCompleteListener(this) { task ->
                        if (task.isSuccessful) {
                            Toast.makeText(
                                baseContext, "SignUp Success",
                                Toast.LENGTH_SHORT
                            ).show()
                        } else {
                            Toast.makeText(
                                baseContext, "SignUp Failed",
                                Toast.LENGTH_SHORT
                            ).show()
                        }
                    }
            }
    
            buttonLogin.setOnClickListener {
    
                val emailEditText = findViewById<EditText>(R.id.emailEditText)
                val emailText = emailEditText.text.toString()
    
                val passEditText = findViewById<EditText>(R.id.passEditText)
                val passText = passEditText.text.toString()
    
                auth.signInWithEmailAndPassword(emailText, passText)
                    .addOnCompleteListener(this) { task ->
                        if (task.isSuccessful) {
                            Toast.makeText(
                                baseContext, "Login Success",
                                Toast.LENGTH_SHORT
                            ).show()
                        } else {
                            Toast.makeText(
                                baseContext, "Login Failed",
                                Toast.LENGTH_SHORT
                            ).show()
                        }
    
                    }
    
            }
        }
    }
    
```

activity_main.xml（最新版）

```

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <Button
            android:text="@string/signup"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/SignUpButton" android:layout_marginTop="13dp"
            app:layout_constraintTop_toBottomOf="@+id/guideline" app:layout_constraintStart_toStartOf="parent"
            android:layout_marginStart="73dp"/>
        <Button
            android:text="@string/login"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/LoginButton" android:layout_marginTop="13dp"
            app:layout_constraintTop_toBottomOf="@+id/guideline" app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginEnd="73dp"/>
        <TextView
            android:text="@string/e_mail"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/emailLabel" app:layout_constraintTop_toTopOf="parent"
            android:layout_marginTop="88dp" app:layout_constraintEnd_toStartOf="@+id/emailEditText"
            android:layout_marginEnd="14dp" app:layout_constraintStart_toStartOf="parent"
            android:layout_marginStart="40dp" android:labelFor="@+id/emailEditText"/>
        <TextView
            android:text="@string/password"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/passLabel" android:layout_marginTop="32dp"
            app:layout_constraintTop_toBottomOf="@+id/emailLabel" app:layout_constraintStart_toStartOf="parent"
            android:layout_marginStart="40dp" android:labelFor="@+id/passEditText"/>
        <EditText
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:inputType="textEmailAddress"
            android:ems="10"
            android:id="@+id/emailEditText"
            app:layout_constraintBottom_toBottomOf="@+id/emailLabel"
            app:layout_constraintTop_toTopOf="@+id/emailLabel" app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginEnd="58dp" android:autofillHints=""/>
        <EditText
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:inputType="textPassword"
            android:ems="10"
            android:id="@+id/passEditText"
            app:layout_constraintTop_toTopOf="@+id/passLabel" app:layout_constraintBottom_toBottomOf="@+id/passLabel"
            app:layout_constraintEnd_toEndOf="parent" android:layout_marginEnd="58dp" android:autofillHints=""/>
        <androidx.support.constraint.Guideline android:layout_width="wrap_content" android:layout_height="wrap_content"
            android:id="@+id/guideline" app:layout_constraintGuide_begin="204dp"
            android:orientation="horizontal"/>
    </androidx.support.constraint.ConstraintLayout>
    
```

##  試したこと

参考記事は2018年に作成されたもので、MainActivity.ktでもエラーが出て、

```

    import android.support.v7.app.AppCompatActivity
    
```

の部分を修正する必要がありました。

レイアウトファイルの書き方が過去のバージョンから現在のバージョンではどのように変わったのか、わからずこちらに質問させていただきました。

## ご回答を受けての修正とエラー

`values/strings.xml`にご提案いただいた内容を記載しましたが、エミュレータを立ち上げると

```

    LoginFunc keeps stopping 
    App info
    Close app
    
```

と表示されて、アプリがすぐに落ちてしまう状態です。

`emailEditText<EditText>`と`passEditText`でMessageに以下のWarningが表示されているほか、

```

    Attribute autofillHints is only used in API level 26 and higher (current min is 19)
    
```

Logcatにはエラー理由が以下のように挙げられています。

```

     Caused by: android.view.InflateException: Binary XML file line #2: Binary XML file line #2: Error inflating class android.support.constraint.ConstraintLayout
         Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class android.support.constraint.ConstraintLayout
         Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.constraint.ConstraintLayout" on path: DexPathList[[zip file "/data/app/com.example.loginfunc-Wy9pYTUxgBnnnIF_42GGOA==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.loginfunc-Wy9pYTUxgBnnnIF_42GGOA==/lib/x86, /system/lib]]
    
```

## 実行環境

Android Studio 3.5.3  
Kotlin 1.3.50
CC BY-SA 4.0
2020-02-15T13:46:59.947
63073
2020-02-17T10:35:32.043
2020-02-17T09:35:20.323
32568
32568
question
android android-studio xml kotlin android-layout
KotlinでFirebase Authenticationを使ったログイン機能を実装するときのエラー
エラーの内容ですが`values/strings.xml`に該当の値がセットされていないために表示されています。エラーの解消には以下の値を同ファイルに追加してみてください。

```

    <string name="signup">Sign up</string>
    <string name="login">Login</string>
    <string name="e_mail">Email</string>
    <string name="password">Password</string>
    
```

qiitaの記事では触れられていませんし、プロジェクトもないようですね。このような記事を利用するにはある程度プロジェクト構成に対する知識が必要になると思います。これ以外にもエラーは表示されるかもしれません。

Androidのライブラリは頻繁に更新されるため、記事が古くなりがちです。公式のチュートリアルやサンプルがお勧めです。英語に抵抗がないならCodelabやUdacityの一部コースは公式の提供になります(ただいずれも最新環境で動かすには手直しが必要だったり…)。

追記: レイアウトファイルの書き方には大きな変更はないです。個別のライブラリに関係しない大きな変更は以下のようになります。

  * サポートライブラリがandroidx、配下に移動されました、Jetpackの利用が推奨されるようになりました。
  * SDKは最新版か最新版-1のターゲットでのビルドが求められるようになりました
  * Kotlinがファーストランゲージになりました、Javaはサポートされますが順次優先度は落ちていきます

**追記**

試しに頂いたファイルでプロジェクトを動かしてみました。私が動かすのに気にした点は以下のとおりとなります。確認してみてください。

  * FireBaseのコンソールでプロジェクトを作ってください。プロジェクトをパッケージ名でFirebaseに関連付ける際に`google-services.json`が得られますので、それをプロジェクトの`app`以下にいれます。またgradleファイルの更新を求められますので適切に更新してください。gradeleファイルをFirebaseの指定通り更新すればソースコードでエラーは出ませんでした。
  * いただいたレイアウトの中にあるConstraintLayoutとGuideLineは参照が`android`からはじまるものになっています。これは最新のものでは`androidx`から始まるものに修正する必要があります。
  * Gradleの`defaultConfig`でminSdkVersonを22に変更しました。このあたりはこちらの事情ですのでもっと低いバージョンでも動くと思います
  * ご指摘の項目(autofillHints)はあってもなくても問題ないです。(OSが要件を満たしてる場合だけ機能しますよという警告になります)

エラーがあるとAndroidStudioのLogcatに表示されています。スタックトレースが出ますので一目でわかるはずです。エラー報告の際にはそちらを見ていただいてどんな`Exception`がでてるか伝えるようにしていただくとわかりやすいです。

**追記**  
ファイルの内容は同じでしたのでこちらに貼りこみはしないことにします。チャットに書き込みましたので再ビルドや、エミュレーターからアプリのアンインストールなどを試していただけますでしょうか?
CC BY-SA 4.0
2020-02-15T14:04:53.740
63074
2020-02-17T10:35:32.043
2020-02-17T10:35:32.043
37777
37777
63073
answer