0

El caso es que tengo 2 EditText (tipo numéricos) creados desde XML. Agregué un botón para "Guardar Cambios" desde el menú cuando los 2 campos estén completos. Escribí código para casos en donde alguno de los 2 campos estén vacíos y funciona. Pero cuando quiero agregar de manera dinámica otros 2 EditText mediante un botón y agrego código para representar esos casos en que esté vacío, no me funciona. Es decir, si yo solamente quisiera completar los campos que fueron creados desde XML, me salta el error mencionado en el título, pero... si doy clic en el botón "add" donde agrego 2 nuevos campos y quiero "Guardar Cambios" ahí no tengo problemas. Pero no tendría que funcionar de esa manera.

Alguien sabe cual puede ser el problema?

Aquí el código en JAVA:

public class cargas_descargas extends AppCompatActivity {

ImageButton btnAddArt;

/*Definir variables tipo EditText para implementarlas luego en el contenido de sus campos*/


EditText eTcantCarga;
EditText eTcantDescarga;

//Para la nueva tupla creada cuando se requiere añadir nuevos campos

EditText editTextCarga_new_art_xml;
EditText editTextDescarga_new_art_xml;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_cargas_descargas);

    btnAddArt = (ImageButton) findViewById(R.id.add_art);

    btnAddArt.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

                AgregarNewArtXML();
            }


        }
    });

    eTcantCarga = (EditText) findViewById(R.id.edtx_carga);

    eTcantDescarga = (EditText) findViewById(R.id.edtx_descarga);

    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
}

public void AgregarNewArtXML() {

    ScrollView sv = (ScrollView) findViewById(R.id.scrl);

    LinearLayout rootLayoutVertical = (LinearLayout) findViewById(R.id.layout_vertical);

    //Crear un contenedor (LinearLayout horizontal) programáticamente 

LinearLayout.LayoutParams rootLayoutHorizontalParams = new 
LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 
LinearLayout.LayoutParams.WRAP_CONTENT);

final LinearLayout rootLayoutHorizontalProgramatico = new LinearLayout(this);


   rootLayoutHorizontalProgramatico.setLayoutParams(rootLayoutHorizontalParams);

    rootLayoutHorizontalProgramatico.setOrientation(LinearLayout.HORIZONTAL);

    rootLayoutHorizontalProgramatico.setWeightSum(2);

    ImageButton btnMenosArt = new ImageButton(this);
    btnMenosArt.setLayoutParams(new LinearLayout.LayoutParams(45, LinearLayout.LayoutParams.WRAP_CONTENT));
    btnMenosArt.setBackgroundResource(R.drawable.ic_menos_art);

    rootLayoutHorizontalProgramatico.addView(btnMenosArt);

    //botón para eliminar la fila creada con el ImageButton con icono de "signo menos"

    btnMenosArt.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            if (rootLayoutHorizontalProgramatico.getChildCount() > 0) {
                rootLayoutHorizontalProgramatico.removeAllViews();
            }

        }
    });

//Creo los 2 EditText de manera dinámica       

    editTextCarga_Programatico = new EditText(this);
    editTextCarga_Programatico.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT, 1));
    editTextCarga_Programatico.setInputType(InputType.TYPE_CLASS_NUMBER);
    editTextCarga_Programatico.setHint("Cantidad");
    rootLayoutHorizontalProgramatico.addView(editTextCarga_Programatico);



    editTextDescarga_Programatico = new EditText(this);
    editTextDescarga_Programatico.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT, 1));
    editTextDescarga_Programatico.setInputType(InputType.TYPE_CLASS_NUMBER);
    editTextDescarga_Programatico.setHint("Cantidad");
    rootLayoutHorizontalProgramatico.addView(editTextDescarga_Programatico);


    rootLayoutVertical.addView(rootLayoutHorizontalProgramatico);

}


@Override
    public boolean onCreateOptionsMenu (Menu menu){
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_cargas_descargas, menu);
        return true;
    }
    @Override
    public boolean onOptionsItemSelected (MenuItem item){
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();





        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings_carga_descarga) {
            return true;
        }




              //Botón menú para "Guardar cambios"
        if (id == R.id.action_save_tanda) {


     String AuxiliarCantCargas = eTcantCarga.getText().toString();
     String AuxiliarCantDescargas = eTcantDescarga.getText().toString();

 String AuxiliarCantCargas_Programatico = editTextCarga_Programatico.getText().toString();

        String AuxiliarCantDescargas_Programatico = editTextDescarga_Programatico.getText().toString();



                //Estructura repetitiva para duplicar el tiempo de duración del Toast

                for (int i = 0; i < 2; i++) {


                    /*Comienzo de las estructuras selectivas para que cada campo de la fila hech en XML esté completo*/

                    //PRIMER CASO: Estructura selectiva para indicar que todos los campos están vacios


                    if (AuxiliarCantCargas.isEmpty() && AuxiliarCantDescargas.isEmpty()) {

                        Toast.makeText(getApplicationContext(), "Error! Los campos están vacíos. Por favor, complete todos los campos", Toast.LENGTH_LONG).show();


                    }
else if (AuxiliarCantCarga.isEmpty()) {

                        Toast.makeText(getApplicationContext(), "Error! El campo de carga está vacío. Por favor complete el campo correspondiente con datos válidos!", Toast.LENGTH_LONG).show();

                    }

else if (AuxiliarCantDescarga.isEmpty()) {

                        Toast.makeText(getApplicationContext(), "Error! El campo de descarga está vacío. Por favor complete el campo correspondiente con datos válidos!", Toast.LENGTH_LONG).show();

                    }

//USO DE LAS VARIABLES EditText programaticas

else if (AuxiliarCantCargas_Programaticas.isEmpty() && AuxiliarCantDescargas_Programaticas.isEmpty()) {

                Toast.makeText(getApplicationContext(), "Error! Los campos de la nueva fila creada dinamicamente están vacios. Por favor, complete los campos correspondientes", Toast.LENGTH_LONG).show();

            }

else if (AuxiliarCantCargas_Programaticas.isEmpty(){

Toast.makeText(getApplicationContext(), "Error! El campo de carga de la fila dinamica está vacío. Por favor, complete el campo correspondiente", Toast.LENGTH_LONG).show();

}

else if (AuxiliarCantDescargas_Programaticas.isEmpty(){

Toast.makeText(getApplicationContext(), "Error! El campo de descarga de la fila dinamica está vacío. Por favor, complete el campo correspondiente", Toast.LENGTH_LONG).show();

}


                    //ULTIMO CASO:

                    else {

                        Toast.makeText(getApplicationContext(), "Los cambios fueron guardados con éxito", Toast.LENGTH_LONG).show();
                        finish();

                    }

                }


            return true;

        }

Código en XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"

android:id="@+id/nueva_cd"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".cargas_descargas"
tools:showIn="@layout/activity_cargas_descargas">



<ScrollView

    android:id="@+id/scrl"
    android:layout_width="match_parent"
    android:layout_height="match_parent">



    <LinearLayout
        android:id="@+id/layout_vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">


    <LinearLayout

            android:id="@+id/layout_horizontal"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal"
            android:background="@android:color/holo_blue_dark">

<ImageButton

                    android:id="@+id/add_art"
                    android:layout_width="45dp"
                    android:layout_height="wrap_content"
                    android:background="@android:color/transparent"
                    android:src="@drawable/ic_add_new_art" />


                <EditText

                    android:id="@+id/edtx_carga"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:hint="Cantidad"
                    android:inputType="number" />

                <EditText

                    android:id="@+id/edtx_descarga"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:hint="Cantidad"
                    android:inputType="number" />

            </LinearLayout>

</LinearLayout> 

</ScrollView>

</LinearLayout>
Rosyec Parrado
  • 526
  • 1
  • 5
  • 16
Juan Pablo
  • 35
  • 8

2 Answers2

1

El problema es que las instancias de los EditText tienen valor null, considera crear estos EditText programáticamente al ser llamado el método onCreate() de la activity:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_cargas_descargas);

    ... 
    ...

    editTextCarga_Programatico = new EditText(this);
    editTextCarga_Programatico.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT, 1));
    editTextCarga_Programatico.setInputType(InputType.TYPE_CLASS_NUMBER);
    editTextCarga_Programatico.setHint("Cantidad");
    rootLayoutHorizontalProgramatico.addView(editTextCarga_Programatico);



    editTextDescarga_Programatico = new EditText(this);
    editTextDescarga_Programatico.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT, 1));
    editTextDescarga_Programatico.setInputType(InputType.TYPE_CLASS_NUMBER);
    editTextDescarga_Programatico.setHint("Cantidad");
    rootLayoutHorizontalProgramatico.addView(editTextDescarga_Programatico);

    ...
    ...
}

de esta forma aseguras que cuando sean usados en otro método ya estan inicializados.

Jorgesys
  • 103,630
  • 13
  • 52
  • 124
  • El problema es que existirán casos donde necesite agregar más filas programaticas con cada clic del boton "add" – Juan Pablo Mar 11 '19 at 21:37
0

Sin necesidad de mirar el codigo, el error que has plasmado indica que intentas obtener el texto de un EditText nulo (sin inicializar).

Vamos que estas haciendo esto:

EditText mEditText;

mEditText.getText();

lscofield
  • 21
  • 2