这是我的代码,我正试图从主要活动转移到这里,早些时候它正在工作,但在实施电话验证后它不工作,idk 我哪里出错了...................... ..................................................... ...................................................
package com.example.ecommerce.fragments
import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import com.example.ecommerce.RegisterAct
import com.example.ecommerce.databinding.FragmentMoreBinding
import com.google.firebase.FirebaseException
import com.google.firebase.auth.*
import com.google.firebase.ktx.Firebase
import java.util.concurrent.TimeUnit
class MoreFragment : Fragment() {
private lateinit var binding: FragmentMoreBinding
private val builder= AlertDialog.Builder(requireContext()).setTitle("Loading.....").setMessage("Please wait").setCancelable(false).create()
private var activityContext: Context? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val context = activityContext ?: return
// Use context here
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
@SuppressLint("SuspiciousIndentation")
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding=FragmentMoreBinding.inflate(layoutInflater)
if(FirebaseAuth.getInstance().currentUser!=null) {
binding.login.visibility=View.GONE
binding.textView5.visibility=View.GONE
return view
}
binding.login.setOnClickListener {
binding.constraint.visibility=View.VISIBLE
binding.cont.setOnClickListener {
auth()
}
}
binding.remove.setOnClickListener {
binding.constraint.visibility=View.GONE
}
binding.register.setOnClickListener{
val intent=Intent(requireContext(),RegisterAct::class.java)
startActivity(intent)
}
return binding.root
}
override fun onAttach(context: Context) {
super.onAttach(context)
activityContext = context
}
override fun onDetach() {
super.onDetach()
}
private fun auth() {
if(binding.Phonenumber.text.isEmpty() || binding.editTextPhone.text.isEmpty()) {
Toast.makeText(requireContext(), "Please fill everything", Toast.LENGTH_SHORT).show()
} else if (binding.editTextPhone.text.toString().trim().length != 2 ) {
Toast.makeText(requireContext(), "Invalid country code", Toast.LENGTH_SHORT).show()
} else if(binding.Phonenumber.text.trim().length != 10 ) {
Toast.makeText(requireContext(), "Invalid Phone number", Toast.LENGTH_SHORT).show()
} else {
otpbhej(binding.editTextPhone.text.toString(),binding.Phonenumber.text.toString())
builder.show()
}
}
private fun otpbhej(Cc: String, phoneNumber: String) {
val options = PhoneAuthOptions.newBuilder(FirebaseAuth.getInstance())
.setPhoneNumber("+" + Cc + phoneNumber) // Phone number to verify
.setTimeout(60L, TimeUnit.SECONDS) // Timeout and unit
.setActivity(requireActivity()) // Activity (for callback binding)
.setCallbacks(callbacks) // OnVerificationStateChangedCallbacks
.build()
PhoneAuthProvider.verifyPhoneNumber(options)
}
val callbacks = object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
override fun onVerificationCompleted(credential: PhoneAuthCredential) {
}
override fun onVerificationFailed(e: FirebaseException) {
}
override fun onCodeSent(
verificationId: String,
token: PhoneAuthProvider.ForceResendingToken,
) {
binding.Phonenumber.visibility=View.GONE
binding.editTextPhone.visibility=View.GONE
builder.dismiss()
binding.OtpNumber.visibility=View.VISIBLE
if(binding.OtpNumber.text.isNotEmpty()) {
checkOTP(verificationId,binding.OtpNumber.text.toString())
}
}
}
private fun checkOTP(verificationId: String, code: String) {
val credential = PhoneAuthProvider.getCredential(verificationId!!, code)
signInWithPhoneAuthCredential(credential)
}
private fun signInWithPhoneAuthCredential(credential: PhoneAuthCredential) {
FirebaseAuth.getInstance().signInWithCredential(credential)
.addOnCompleteListener(requireActivity()) { task ->
if (task.isSuccessful) {
Toast.makeText(requireContext(), "You are signed in", Toast.LENGTH_SHORT).show()
val user = task.result?.user
} else {
Toast.makeText(requireContext(), "Something went wrong", Toast.LENGTH_SHORT).show()
}
}
}
}
不知道为什么我会收到这个错误
`
Process: com.example.ecommerce, PID: 4130
java.lang.IllegalStateException: Fragment MoreFragment{f2ca588} (0a0f4eb7-5df8-4d00-aa6d-18838fd9f570) not attached to a context.
at androidx.fragment.app.Fragment.requireContext(Fragment.java:967)
at com.example.ecommerce.fragments.MoreFragment.<init>(MoreFragment.kt:22)
at com.example.ecommerce.MainActivity$onCreate$2.invoke(MainActivity.kt:37)
at com.example.ecommerce.MainActivity$onCreate$2.invoke(MainActivity.kt:31)
at me.ibrahimsn.lib.SmoothBottomBar$setOnItemSelectedListener$1.onItemSelect(SmoothBottomBar.kt:613)
at me.ibrahimsn.lib.SmoothBottomBar.onClickAction(SmoothBottomBar.kt:541)
at me.ibrahimsn.lib.SmoothBottomBar.onTouchEvent(SmoothBottomBar.kt:523)
at android.view.View.dispatchTouchEvent(View.java:14632)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3169)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2845)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3169)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2845)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3169)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2845)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3169)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2845)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3169)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2845)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3169)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2845)
at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:573)
at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1911)
at android.app.Activity.dispatchTouchEvent(Activity.java:4256)
at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:70)
at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:521)
at android.view.View.dispatchPointerEvent(View.java:14899)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:6755)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:6526)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5995)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:6057)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:6018)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:6192)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:6026)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:6249)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5999)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:6057)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:6018)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:6026)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5999)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:9034)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:8985)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:8941)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:9177)
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:266)
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:339)
at android.os.Looper.loopOnce(Looper.java:179)
at android.os.Looper.loop(Looper.java:344)
at android.app.ActivityThread.main(ActivityThread.java:8212)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:584)
E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1034)
I/Process: Sending signal. PID: 4130 SIG: 9
发生此错误是因为您在 Fragment 未附加到任何上下文(在构造函数中)时试图获取上下文。片段仅在 Fragment.onAttach(context) 方法中附加到上下文。
只有在 Fragment 获得此上下文后,您才必须调用 requireContext()。例如,在 onCreateView() 方法中。
class MoreFragment : Fragment() {
private lateinit var builder: AlertDialog.Builder
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
builder= AlertDialog.Builder(requireContext()).setTitle("Loading.....").setMessage("Please wait").setCancelable(false).create()
...
}
}