#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 говорится, что ошибка может быть связана со старой версией зависимостей, я обновил их, но они остались прежними.