0 votos

Hola, estoy cambiando el codigo para utilizar Binding, pero tengo un problema con el codigo.

Tengo este codigo con findViewById para que me lee un pdf, y lo muestra sin problemas.

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View rootView  = inflater.inflate( R.layout.todos_pdf, container, false );

    pdfView = (PDFView) rootView.findViewById(R.id.pdf2View_PDF);

    pdfView.fromAsset("archivo.pdf").load();

 return rootView;

}

Para utilizar Binding, algo me falta porque cuando inicio la aplicación y pulso el boton para mostrar el pdf, se produce un error.
Para utilizar Binding utilizo este codigo:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    
    binding = TodosPdfBinding.inflate(inflater, container, false);

    pdfView.fromAsset("Consigna.pdf").load();

 return binding.getRoot();

}

 

Y un caso mas, un EditText:

<EditText
    android:id="@+id/editTextPassword"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:hint="  Introducir Contraseña  "
    android:importantForAutofill="no"
    android:inputType="textPassword"
>
                            

En findViewById

String password = ((EditText) rootView.findViewById(R.id.editTextPassword)).getText().toString();

y con binding tambien me estoy liando.

 

Agradecería vuestra ayuda.

por en Android
editado por

1 Respuesta

+1 voto
Mejor respuesta

Con binding es más fácil que eso. Los pasos son los siguientes:

1. Creas un elemento en la vista de XML (con el editor o directamente con XML). Por ejemplo tu: EditText

2. Le pones un id al elemento de XML que sea convertible a variable de Java (sin símbolos raros). Por ejemplo el que has puesto: editTextPassword

3. En el Fragment o Activity tienes que tener una variable privada (se suele crear automáticamente):

    // Para Activity:
    private ActivityMainBinding binding;
    
    // Para Fragment:
    private FragmentFirstBinding binding;

 

4. En el onCreate la inflas (también suele venir creada automáticamente):

// Para Activity
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());
        
        // ...


    }

// Para Fragment
    @Override
    public View onCreateView(
            LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState
    ) {

        binding = FragmentSecondBinding.inflate(inflater, container, false);
        
        // ...
        
        return binding.getRoot();

    }

5. Usas el binding para llamar a tu EditText de id "editTextPassword" con (después del binding es el id, por ejemplo: binding.id...). En tu ejemplo:

binding.editTextPassword...

Para tu ejemplo completo sería (fíjate en que el código es más sencillo y legible, además que asegura que siempre exista en ese XML que se está inflando):

String password = binding.editTextPassword.getText().toString();

 

por
seleccionada por
Pues visto así ahora si me parece fácil, jeje, gracias

De todas formas no voy a cerrar el post porque puede que tenga algún que otro problema con el Binding, y así lo pregunto aquí.