-1

So I have a Fragment known as LoginHomeFragment which contains buttons to 2 fragments of my app, RegisterFragment & LoginFragment The button click for RegisterFragment works perfectly But when the LoginFragment button is clicked, the app automatically closes. This is the same when I redirect to the LoginFragment from my RegisterFragment. The code for my app is the following:-

LoginHomeFragment.kt

class LoginHomeFragment : Fragment() {

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    var view = inflater.inflate(R.layout.fragment_login_home, container, false)

    view.findViewById<Button>(R.id.btn_dir_register).setOnClickListener {
        var navRegister = activity as FragmentNavigation
        navRegister.navigateFrag(RegisterFragment(), false)
    }

    view.findViewById<Button>(R.id.btn_dir_login).setOnClickListener {
        var navRegister = activity as FragmentNavigation
        navRegister.navigateFrag(LoginFragment(), false)
    }

    return view
}
}

LoginFragment.kt

class LoginFragment : Fragment() {
private lateinit var username: EditText
private lateinit var password: EditText
private lateinit var forgot: EditText
private lateinit var fAuth: FirebaseAuth

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    val view =  inflater.inflate(R.layout.fragment_login, container, false)

    username = view.findViewById(R.id.log_username)
    password = view.findViewById(R.id.log_password)
    fAuth = Firebase.auth
    forgot = view.findViewById(R.id.forgot_pwd)

    view.findViewById<Button>(R.id.btn_register).setOnClickListener {
        val navRegister = activity as FragmentNavigation
        navRegister.navigateFrag(RegisterFragment(), false)
    }

    view.findViewById<Button>(R.id.btn_login).setOnClickListener {
        validateForm()
    }

    forgot.setOnClickListener {
        forgotpassword()
    }

    return view
}

private fun forgotpassword() {
    val icon = AppCompatResources.getDrawable(requireContext(), R.drawable.ic_warning)

    icon?.setBounds(0, 0, icon.intrinsicWidth, icon.intrinsicHeight)
    when {
        TextUtils.isEmpty(username.text.toString().trim()) -> {
            username.setError("Please Enter Your Registered Email-Id", icon)
        }

        username.text.toString().isNotEmpty() -> {
            if (username.text.toString().matches(Regex("[a-zA-Z0-9._-]+@[a-z]+\\.+[a-z]+"))) {
                Firebase.auth.sendPasswordResetEmail(username.text.toString())
                    .addOnCompleteListener { task ->
                        if (task.isSuccessful) {
                            Log.d(TAG, "Password reset email sent.")
                        } else {
                            Toast.makeText(context, task.exception?.message, Toast.LENGTH_SHORT).show()
                        }
                    }
            } else {
                username.setError("Please enter valid email-id.", icon)
            }
        }
    }
}

private fun validateForm() {
    val icon = AppCompatResources.getDrawable(requireContext(),R.drawable.ic_warning)

    icon?.setBounds(0,0,icon.intrinsicWidth,icon.intrinsicHeight)
    when{
        TextUtils.isEmpty(username.text.toString().trim())->{
            username.setError("Please Enter Username", icon)
            btn_register_reg.isEnabled = false
        }
        TextUtils.isEmpty(password.text.toString().trim())->{
            password.setError("Please Enter Password", icon)
            btn_register_reg.isEnabled = false
        }

        username.text.toString().isNotEmpty() &&
                password.text.toString().isNotEmpty() -> {

            if (username.text.toString().matches(Regex("[a-zA-Z0-9._-]+@[a-z]+\\.+[a-z]+"))) {
                firebaseSignIn()
            } else {
                username.setError("Please enter valid email-id.", icon)
            }
        }
    }
}

private fun firebaseSignIn() {
    btn_login.isEnabled = false
    btn_login.alpha = 0.5f
    fAuth.signInWithEmailAndPassword(username.text.toString(), password.text.toString())
        .addOnCompleteListener { task ->
            if (task.isSuccessful) {
                Toast.makeText(context, "Login Successful", Toast.LENGTH_SHORT).show()
                    activity?.let {
                        val intent = Intent(it, HomeActivity::class.java)
                        it.startActivity(intent)
                    }
            } else {
                btn_login.isEnabled = true
                btn_login.alpha = 1f
                Toast.makeText(context, task.exception?.message, Toast.LENGTH_SHORT).show()
            }
        }
}
}

fragment_login.xml

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".LoginFragment">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:focusableInTouchMode="true"
    android:orientation="vertical">

    <ImageView
        android:layout_width="70dp"
        android:layout_height="wrap_content"
        android:adjustViewBounds="true"
        android:layout_marginTop="90dp" />
    <!-- TODO add the image -->

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="MedDrone"
        android:textColor="#000"
        android:textSize="15dp"
        android:layout_marginTop="11dp" />

    <com.google.android.material.textfield.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Email"
        app:boxBackgroundColor="#F8E9FD"
        android:layout_marginTop="50dp"
        android:layout_marginStart="40dp"
        android:layout_marginEnd="40dp">

        <com.google.android.material.textfield.TextInputEditText
            android:id="@+id/log_username"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    </com.google.android.material.textfield.TextInputLayout>

    <com.google.android.material.textfield.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Password"
        app:boxBackgroundColor="#F8E9FD"
        android:layout_marginTop="10dp"
        android:layout_marginStart="40dp"
        android:layout_marginEnd="40dp">

        <com.google.android.material.textfield.TextInputEditText
            android:id="@+id/log_password"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="textPassword"/>

    </com.google.android.material.textfield.TextInputLayout>

    <com.google.android.material.textfield.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:boxBackgroundColor="#F8E9FD"
        android:layout_marginTop="10dp"
        android:layout_marginStart="40dp"
        android:layout_marginEnd="40dp">

        <com.google.android.material.textview.MaterialTextView
            android:id="@+id/forgot_pwd"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Forgot Password?"
            android:textColor="@color/zm_red"/>

    </com.google.android.material.textfield.TextInputLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp">

        <com.google.android.material.button.MaterialButton
            android:id="@+id/btn_login"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentEnd="true"
            android:layout_marginEnd="40dp"
            android:text="Login" />

        <com.google.android.material.button.MaterialButton
            android:id="@+id/btn_register"
            style="@style/Widget.MaterialComponents.Button.TextButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginEnd="40dp"
            android:layout_toLeftOf="@+id/btn_login"
            android:text="Register" />

    </RelativeLayout>

</LinearLayout>

</ScrollView>

LogCat

2022-01-05 17:12:47.303 19721-19721/com.rgoel.meddrone E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.rgoel.meddrone, PID: 19721
java.lang.ClassCastException: com.google.android.material.textview.MaterialTextView cannot be cast to android.widget.EditText
    at com.rgoel.meddrone.LoginFragment.onCreateView(LoginFragment.kt:38)
    at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2963)
    at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:518)
    at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282)
    at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2189)
    at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2100)
    at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:2002)
    at androidx.fragment.app.FragmentManager$5.run(FragmentManager.java:524)
    at android.os.Handler.handleCallback(Handler.java:938)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:254)
    at android.app.ActivityThread.main(ActivityThread.java:8231)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:612)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1006)
Mahaboss
  • 19
  • 3
  • 1
    Please also include the crash logs so the bug can be recognized faster. – YektaDev Jan 05 '22 at 08:22
  • 1
    Does this answer your question? [Unfortunately MyApp has stopped. How can I solve this?](https://stackoverflow.com/questions/23353173/unfortunately-myapp-has-stopped-how-can-i-solve-this) – a_local_nobody Jan 05 '22 at 08:22
  • Did you check error log? Post app error log here. – Lokesh Jan 05 '22 at 09:03
  • I didn't find any error log... Please confirm... – Mahaboss Jan 05 '22 at 09:41
  • Just tell me how I can find it?? Not sure how to... The app crashes in the implementation on my physical device... – Mahaboss Jan 05 '22 at 09:42
  • Also, @a_local_nobody the app just simply closes and doesn't show any error message It's like there is some code for it to end the application when the button is clicked or when the fragment is run. – Mahaboss Jan 05 '22 at 09:43
  • apps don't simply decide they want to close, if there's a crash, there's a stack trace and without it, we can't guess what's wrong. find the stack trace with the link i've already provided you, then you honestly don't even need our help anymore after you just search for the cause – a_local_nobody Jan 05 '22 at 10:44
  • Added the logcat, please tell now... – Mahaboss Jan 05 '22 at 11:45
  • Don't need it now.... Added it on my own... – Mahaboss Jan 05 '22 at 14:10

1 Answers1

0

The answer:-

LoginFragment.kt

class LoginFragment : Fragment() {
private lateinit var username: EditText
private lateinit var password: EditText
private lateinit var fAuth: FirebaseAuth

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    val view =  inflater.inflate(R.layout.fragment_login, container, false)

    username = view.findViewById(R.id.log_username)
    password = view.findViewById(R.id.log_password)
    fAuth = Firebase.auth

    view.findViewById<Button>(R.id.btn_register).setOnClickListener {
        val navRegister = activity as FragmentNavigation
        navRegister.navigateFrag(RegisterFragment(), false)
    }

    view.findViewById<Button>(R.id.btn_login).setOnClickListener {
        validateForm()
    }


    view.findViewById<TextView>(R.id.forgot_pwd).setOnClickListener {
        forgotpassword()
    }

    return view
}

private fun forgotpassword() {
    val icon = AppCompatResources.getDrawable(requireContext(), R.drawable.ic_warning)

    icon?.setBounds(0, 0, icon.intrinsicWidth, icon.intrinsicHeight)
    when {
        TextUtils.isEmpty(username.text.toString().trim()) -> {
            username.setError("Please Enter Your Registered Email-Id", icon)
        }

        username.text.toString().isNotEmpty() -> {
            if (username.text.toString().matches(Regex("[a-zA-Z0-9._-]+@[a-z]+\\.+[a-z]+"))) {
                Firebase.auth.sendPasswordResetEmail(username.text.toString())
                    .addOnCompleteListener { task ->
                        if (task.isSuccessful) {
                            Log.d(TAG, "Password reset email sent.")
                        } else {
                            Toast.makeText(context, task.exception?.message, Toast.LENGTH_SHORT).show()
                        }
                    }
            } else {
                username.setError("Please enter valid email-id.", icon)
            }
        }
    }
}

private fun validateForm() {
    val icon = AppCompatResources.getDrawable(requireContext(),R.drawable.ic_warning)

    icon?.setBounds(0,0,icon.intrinsicWidth,icon.intrinsicHeight)
    when{
        TextUtils.isEmpty(username.text.toString().trim())->{
            username.setError("Please Enter Username", icon)
            btn_register_reg.isEnabled = false
        }
        TextUtils.isEmpty(password.text.toString().trim())->{
            password.setError("Please Enter Password", icon)
            btn_register_reg.isEnabled = false
        }

        username.text.toString().isNotEmpty() &&
                password.text.toString().isNotEmpty() -> {

            if (username.text.toString().matches(Regex("[a-zA-Z0-9._-]+@[a-z]+\\.+[a-z]+"))) {
                firebaseSignIn()
            } else {
                username.setError("Please enter valid email-id.", icon)
            }
        }
    }
}

private fun firebaseSignIn() {
    btn_login.isEnabled = false
    btn_login.alpha = 0.5f
    fAuth.signInWithEmailAndPassword(username.text.toString(), password.text.toString())
        .addOnCompleteListener { task ->
            if (task.isSuccessful) {
                Toast.makeText(context, "Login Successful", Toast.LENGTH_SHORT).show()
                    activity?.let {
                        val intent = Intent(it, HomeActivity::class.java)
                        it.startActivity(intent)
                    }
            } else {
                btn_login.isEnabled = true
                btn_login.alpha = 1f
                Toast.makeText(context, task.exception?.message, Toast.LENGTH_SHORT).show()
            }
        }
}
}

fragment_login.xml

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".LoginFragment">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:focusableInTouchMode="true"
    android:orientation="vertical">

    <ImageView
        android:layout_width="70dp"
        android:layout_height="wrap_content"
        android:adjustViewBounds="true"
        android:layout_marginTop="90dp" />
    <!-- TODO add the image -->

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="MedDrone"
        android:textColor="#000"
        android:textSize="15dp"
        android:layout_marginTop="11dp" />

    <com.google.android.material.textfield.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Email"
        app:boxBackgroundColor="#F8E9FD"
        android:layout_marginTop="50dp"
        android:layout_marginStart="40dp"
        android:layout_marginEnd="40dp">

        <com.google.android.material.textfield.TextInputEditText
            android:id="@+id/log_username"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    </com.google.android.material.textfield.TextInputLayout>

    <com.google.android.material.textfield.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Password"
        app:boxBackgroundColor="#F8E9FD"
        android:layout_marginTop="10dp"
        android:layout_marginStart="40dp"
        android:layout_marginEnd="40dp">

        <com.google.android.material.textfield.TextInputEditText
            android:id="@+id/log_password"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="textPassword"/>

    </com.google.android.material.textfield.TextInputLayout>

    <TextView
        android:id="@+id/forgot_pwd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="-25dp"
        android:layout_marginTop="10dp"
        android:layout_marginEnd="80dp"
        android:text="Forgot Password?"
        android:textColor="@color/zm_red"
        android:textSize="15dp"/>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp">

        <com.google.android.material.button.MaterialButton
            android:id="@+id/btn_login"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentEnd="true"
            android:layout_marginEnd="40dp"
            android:text="Login" />

        <com.google.android.material.button.MaterialButton
            android:id="@+id/btn_register"
            style="@style/Widget.MaterialComponents.Button.TextButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginEnd="40dp"
            android:layout_toLeftOf="@+id/btn_login"
            android:text="Register" />

    </RelativeLayout>

</LinearLayout>

</ScrollView>
Mahaboss
  • 19
  • 3