Search code examples
androidkotlinandroid-dialogfragmentandroid-textinputedittext

How to get text of textInputEditText in a dialog?


I am trying to get the text of a textInputEditText, which is in a dialog (to be exact the onCreateDialog method in the set positive button section), but it doesn't work. I've read many questions which already are on StackOverflow, but none helped me.

The variable inputAddTunnel in which the text should be saved, is always just equal to "":

private fun getInput(): String {
    val inputAddTunnel = this.layoutInflater.inflate(R.layout.dialog_add_vpn_tunnel,null).findViewById<TextInputEditText>(R.id.input_add_tunnel).getText().toString()

    return inputAddTunnel
}

The Xml for the dialog is:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<com.google.android.material.textfield.TextInputLayout
    android:id="@+id/input_add_tunnel_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="8dp"
    android:hint="@string/name_of_vpn">

    <com.google.android.material.textfield.TextInputEditText
        android:id="@+id/input_add_tunnel"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"/>
</com.google.android.material.textfield.TextInputLayout>

Edit: Here is the onCreateDialog() method

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    return activity?.let {

        val builder = androidx.appcompat.app.AlertDialog.Builder(it)
        // Get the layout inflater
        val inflater = requireActivity().layoutInflater

        // Inflate and set the layout for the dialog
        // Pass null as the parent view because its going in the dialog layout
        builder.setView(inflater.inflate(R.layout.dialog_add_vpn_tunnel, null))
            // Add action buttons
            .setPositiveButton(R.string.add_vpn_tunnel,
                DialogInterface.OnClickListener { dialog, id ->
                    // Add VPN tunnel
                    addVpn()
                })
            .setNegativeButton(R.string.cancel,
                DialogInterface.OnClickListener { dialog, id ->
                    getDialog()?.cancel()
                })
        builder.create()
    } ?: throw IllegalStateException("Activity cannot be null")
}

And this is the addVpn method, which is called in onCreateDialog():

private fun addVpn() {
    // TODO test function addVpn(); count doesn't work properly
    val count = activity?.getPreferences(AppCompatActivity.MODE_PRIVATE)?.getInt("countTunnels", -1)
    val inputAddTunnel = getInput()

    // If inputAddTunnel is not equal to "", put it in getPreferences
    if(inputAddTunnel != "") { //TODO test if !== is needed, not !=
        activity?.getPreferences(AppCompatActivity.MODE_PRIVATE)?.
        edit()?.putString("tunnel$count", inputAddTunnel).apply {  }
    }

    // Edit the count in getPreferences to the incremented count
    count?.plus(1)
    if (count != null) {
        activity?.getPreferences(AppCompatActivity.MODE_PRIVATE)?.getInt("countTunnels", count)
    }
}

Solution

  • You need to get editext object from dialog view and call getText() method

    Edittext edittext= getDialog().getView().findViewbyId(R.id.editText);
    
    edittext.getText(); // for getting textvalue from editetxt