Las vistas dinámicas se crean cuando no queremos tener un código XML repetido. En este artículo, crearemos un diseño separado y los inflaremos dentro de un LinearLayout , luego almacenaremos los datos del usuario en un ArrayList y luego los mostraremos como brindis . qué
Implementación paso a paso
Paso 1: Crear un nuevo proyecto
Para crear un nuevo proyecto en Android Studio, consulte Cómo crear/iniciar un nuevo proyecto en Android Studio . Tenga en cuenta que seleccione Kotlin como lenguaje de programación
Paso 2: agregue la dependencia dentro de build.gradle (aplicación)
Agregue la dependencia Ver enlace dentro de build.gradle (aplicación) y haga clic en el botón sincronizar ahora.
android {
..
construir características {
viewBinding true
}
}
Paso 3: trabajar con el archivo activity_main.xml
Vaya al archivo activity_main.xml y consulte el siguiente código. A continuación se muestra el código para el archivo activity_main.xml . Tenga en cuenta que tiene un diseño lineal con id parent_linear_layout que inflaremos para agregar nuestras vistas.
XML
<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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" android:orientation="vertical" tools:context=".MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="15dp" android:text="Programming Language List" android:textColor="@color/black" android:textSize="15sp" /> <!--This is the parent linear layout which we will inflate soon--> <LinearLayout android:id="@+id/parent_linear_layout" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" /> <com.google.android.material.button.MaterialButton android:id="@+id/button_add" android:layout_width="wrap_content" android:layout_height="50dp" android:layout_marginLeft="15dp" android:layout_marginTop="10dp" android:drawableRight="@drawable/ic_add" android:paddingLeft="10dp" android:paddingRight="10dp" android:text="Add" android:textAllCaps="false" android:textColor="@color/white" /> <com.google.android.material.button.MaterialButton android:id="@+id/button_submit_list" android:layout_width="match_parent" android:layout_height="50dp" android:layout_marginLeft="15dp" android:layout_marginTop="10dp" android:layout_marginRight="15dp" android:paddingLeft="10dp" android:paddingRight="10dp" android:text="Submit List" android:textAllCaps="false" android:textColor="@color/white" /> <com.google.android.material.button.MaterialButton android:id="@+id/button_show_list" android:layout_width="match_parent" android:layout_height="50dp" android:layout_marginLeft="15dp" android:layout_marginTop="10dp" android:layout_marginRight="15dp" android:paddingLeft="10dp" android:paddingRight="10dp" android:text="Show List Data" android:textAllCaps="false" android:textColor="@color/white" /> </LinearLayout>
Paso 4: Crea un nuevo diseño
Cree un nuevo diseño denominado row_add_language.xml . Este es el diseño separado que inflaremos dentro del Diseño lineal con id parent_linear_layout .
XML
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="10dp"> <EditText android:id="@+id/et_name" android:layout_width="200dp" android:layout_height="50dp" android:hint="Enter language" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent" /> <Spinner android:id="@+id/exp_spinner" android:layout_width="100dp" android:layout_height="50dp" android:layout_marginStart="20dp" android:entries="@array/experience" app:layout_constraintLeft_toRightOf="@id/et_name" app:layout_constraintTop_toTopOf="parent"/> </androidx.constraintlayout.widget.ConstraintLayout>
Paso 5: agregue el elemento de entradas en string.xml que hemos usado en Spinner
XML
<string-array name="experience"> <item>Exp</item> <item>1 Year</item> <item>2 Year</item> <item>3 Year</item> <item>4 Year</item> </string-array>
Paso 6: crea una nueva clase de Kotlin
Cree una nueva clase de Kotlin Language.kt . Esta es la clase genérica que usaremos para Arraylist para almacenar datos.
Kotlin
class Language( var name: String = "", var exp: String = "" ) { }
Paso 7: trabajar con el archivo MainActivity.kt
Vaya al archivo MainActivity.kt y consulte el siguiente código. A continuación se muestra el código del archivo MainActivity.kt . Se agregan comentarios dentro del código para comprender el código con más detalle.
Kotlin
import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.widget.EditText import android.widget.Spinner import android.widget.Toast import androidx.appcompat.app.AppCompatActivity // Provide your package name here import com.example.addviewsdynamically.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { // initiate viewBinding private var _binding: ActivityMainBinding? = null private val binding get() = _binding!! // create an arraylist in which // we will store user data private var languageList = ArrayList<Language>() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) _binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) // This addButton is used to add a new view // in the parent linear layout binding.buttonAdd.setOnClickListener { addNewView() } // This Submit Button is used to store all the // data entered by user in arraylist binding.buttonSubmitList.setOnClickListener { saveData() } // This Show button is used to show data // stored in the arraylist. binding.buttonShowList.setOnClickListener { showData() } } // This function is called after // user clicks on addButton private fun addNewView() { // this method inflates the single item layout // inside the parent linear layout val inflater = LayoutInflater.from(this).inflate(R.layout.row_add_language, null) binding.parentLinearLayout.addView(inflater, binding.parentLinearLayout.childCount) } // This function is called after user // clicks on Submit Button private fun saveData() { languageList.clear() // this counts the no of child layout // inside the parent Linear layout val count = binding.parentLinearLayout.childCount var v: View? for (i in 0 until count) { v = binding.parentLinearLayout.getChildAt(i) val languageName: EditText = v.findViewById(R.id.et_name) val experience: Spinner = v.findViewById(R.id.exp_spinner) // create an object of Language class val language = Language() language.name = languageName.text.toString() language.exp = experience.selectedItem as String // add the data to arraylist languageList.add(language) } } // This function is called after user // clicks on Show List data button private fun showData() { val count = binding.parentLinearLayout.childCount for (i in 0 until count) { Toast.makeText(this, "Language at $i is ${languageList[i].name} and experience is ${languageList[i].exp} ", Toast.LENGTH_SHORT).show() } } override fun onDestroy() { super.onDestroy() _binding = null } }
Producción:
Repositorio de Github aquí .