Сбой приложения Firebase kotlin android Studio при втором действии

#android #firebase #kotlin

# #Android #firebase #kotlin

Вопрос:

Я следил за этим уроком YouTube (https://www.youtube.com/watch?v=0hkyXuKTFYY ) и произошло нижеприведенное. Для него в видео, в 6:30, его приложение тоже разбилось, но он решил это позже в видео. Для меня, похоже, ничего не работает.

Пожалуйста, ПОМОГИТЕ!

Это мой logcat:

 12-09 19:36:45.321 28337-28337/? E/Zygote: v2
12-09 19:36:45.331 28337-28337/? E/Zygote: accessInfo : 0
12-09 19:36:47.831 28337-28337/konark.studios.ourtimetable E/AndroidRuntime: FATAL EXCEPTION: main
    Process: konark.studios.ourtimetable, PID: 28337
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{konark.studios.ourtimetable/konark.studios.ourtimetable.RegisterActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3132)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3415)
        at android.app.ActivityThread.access$1100(ActivityThread.java:229)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1821)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:7325)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference
        at android.content.ContextWrapper.getApplicationInfo(ContextWrapper.java:162)
        at android.view.ContextThemeWrapper.getTheme(ContextThemeWrapper.java:109)
        at android.content.Context.obtainStyledAttributes(Context.java:514)
        at androidx.appcompat.app.AppCompatDelegateImpl.createSubDecor(AppCompatDelegateImpl.java:839)
        at androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor(AppCompatDelegateImpl.java:806)
        at androidx.appcompat.app.AppCompatDelegateImpl.findViewById(AppCompatDelegateImpl.java:630)
        at androidx.appcompat.app.AppCompatActivity.findViewById(AppCompatActivity.java:223)
        at konark.studios.ourtimetable.RegisterActivity.<init>(RegisterActivity.kt:20)
        at java.lang.Class.newInstance(Native Method)
        at android.app.Instrumentation.newActivity(Instrumentation.java:1096)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3122)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3415) 
        at android.app.ActivityThread.access$1100(ActivityThread.java:229) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1821) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:148) 
        at android.app.ActivityThread.main(ActivityThread.java:7325) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120

Первое действие открывается как обычно: ## Заголовок ##
введите описание изображения здесь

Когда я нажимаю кнопку «Создать учетную запись» (внизу), предполагается, что она перейдет ко второму действию. Но, к сожалению, он выходит из строя.

Код второго действия (то есть сбой):

 package konark.studios.ourtimetable

import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.util.Patterns
import android.view.WindowManager
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.auth.ktx.auth
import com.google.firebase.ktx.Firebase

class RegisterActivity : AppCompatActivity() {

    var registerBtn = findViewById<Button>(R.id.RegisterButton)
    var usernamebox = findViewById<EditText>(R.id.emailbox)
    var passwordbox = findViewById<EditText>(R.id.passwordbox)
    val intentLoginActivity = Intent(this, LoginActivity::class.java)
    private lateinit var auth: FirebaseAuth

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN)
        setContentView(R.layout.activity_register)
        supportActionBar?.hide();
        auth = Firebase.auth

        registerBtn.setOnClickListener {
            signUpUser()
        }
    }

    private fun signUpUser() {

        if (usernamebox.text.toString().isEmpty()) {
            usernamebox.error = "Please enter your email"
            usernamebox.requestFocus()
            return
        }

        if (Patterns.EMAIL_ADDRESS.matcher(usernamebox.text.toString()).matches()) {
            usernamebox.error = "Please enter a valid email"
            usernamebox.requestFocus()
            return
        }

        if (passwordbox.text.toString().isEmpty()) {
            passwordbox.error = "Please enter a password"
            passwordbox.requestFocus()
            return
        }

        auth.createUserWithEmailAndPassword(usernamebox.text.toString(), passwordbox.text.toString())
                .addOnCompleteListener(this) { task ->
                    if (task.isSuccessful) {
                        startActivity(Intent(intentLoginActivity))
                    } else {
                        Toast.makeText(baseContext, "Authentication failed",
                                Toast.LENGTH_SHORT).show()
                    }
                }
    }
}
 

Это код первого действия, которое является начальным экраном:

 package konark.studios.ourtimetable

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.provider.AlarmClock.EXTRA_MESSAGE
import android.util.Log
import android.view.Window
import android.view.WindowManager
import android.widget.Button
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.auth.FirebaseUser
import com.google.firebase.auth.ktx.auth
import com.google.firebase.ktx.Firebase

class LoginActivity : AppCompatActivity() {

    private lateinit var auth: FirebaseAuth

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN)
        setContentView(R.layout.activity_login)
        supportActionBar?.hide();
        auth = Firebase.auth

        var createAccountBtn = findViewById<Button>(R.id.AccountCreation)
        val intentAccountCreate = Intent(this, RegisterActivity::class.java)
        createAccountBtn.setOnClickListener {
            Log.d("Action","Register Button Clicked")
            startActivity(intentAccountCreate)
            finish()
        }
    }

    public override fun onStart() {
        super.onStart()
        // Check if user is signed in (non-null) and update UI accordingly.
        val currentUser = auth.currentUser
        updateUI(currentUser)
    }

    private fun updateUI(currentUser: FirebaseUser?) {

    }
}
 

Ответ №1:

 var registerBtn = findViewById<Button>(R.id.RegisterButton)
var usernamebox = findViewById<EditText>(R.id.emailbox)
var passwordbox = findViewById<EditText>(R.id.passwordbox)
val intentLoginActivity = Intent(this, LoginActivity::class.java)
 

Переместите эти вызовы функций из инициализаторов свойств в onCreate() функцию.

На этапе инициализации слишком рано использовать Activity как Context или настроить окно действия, чтобы вы могли вызывать findViewById() . (Также, прежде setContentView() чем вы просто получите нули обратно.)

Комментарии:

1. Спасибо, что сообщили мне об этом, но, к сожалению, это не помогло. Также закомментирование функции signUpUser() возвращает ту же ошибку.

Ответ №2:

Сначала убедитесь, что ваше действие объявлено в вашем файле AndroidManifest. Тогда попробуйте :

 createAccountBtn.setOnClickListener {
    val intentAccountCreate = Intent(context, RegisterActivity::class.java)
    Log.d("Action","Register Button Clicked")
    startActivity(intentAccountCreate)
    finish()
}
 

попробуйте сделать это следующим образом

Комментарии:

1. @AbhinavPrabhakar попробуйте один раз прокомментировать часть: window.setFlags(WindowManager. Параметры компоновки. FLAG_FULLSCREEN, WindowManager. Параметры компоновки. FLAG_FULLSCREEN), или выполнив this.window.setFlags и т. д

2. : (Все то же самое

3. @AbhinavPrabhakar вы уверены, что ваше действие было объявлено на вашем AndroidManifest.xml файл?

4. Да. В видео на YouTube говорится, что ошибка может быть связана со старой версией зависимостей, я обновил их, но они остались прежними.