Ver encuadernación: ¿cómo obtengo una encuadernación para los diseños incluidos?

8 minutos de lectura

avatar de usuario
artur kasprzak

Mientras trabajaba con el enlace de vista, me encontré con un par de casos sin documentar.

Primero: ¿Cómo obtengo el enlace para las partes del diseño de vista incluidas? El enlace principal solo ve los elementos definidos en el diseño principal.

Segundo: ¿Cómo obtengo enlaces para partes de diseño fusionadas? Nuevamente, ¿el enlace principal solo ve elementos en el diseño principal?

  • La otra forma simple sería usar la biblioteca de enlace de datos. Luego envuelva su diseño XML con la etiqueta para que, si está utilizando la biblioteca, genere automáticamente las clases necesarias para vincular las vistas en el diseño con sus objetos de datos. Honestamente, creo que es el camino a seguir. Sigue la guía aquí

    – Arun Gurung

    27 de abril de 2020 a las 10:54

  • Hola, he escrito una publicación de blog que explica completamente el enlace de vista y junto con el manejo de la etiqueta incluida con la combinación y el pago de diseños incluidos 👉Androidbites|Visualización de enlaces

    – Chetan Gupta

    6 de diciembre de 2020 a las 10:54

  • Estoy un poco atrapado aquí: stackoverflow.com/questions/67808297/…

    – SharePeng Hu

    4 de junio de 2021 a las 9:09

  • Por cierto, para cualquiera que se pregunte cómo usar el enlace de vista para configurar el logotipo de la barra de aplicacionessolo use el objeto de oferta como: vinculante.barra de herramientas.setLogo(R.drawable.bar_logo);. Cambios en ‘binding’ y ‘bar_logo’ según su necesidad.

    – Ajowi

    13 de agosto de 2021 a las 5:51

avatar de usuario
artur kasprzak

En caso de:

  1. Incluir con diseño genérico (no fusionar nodo), necesitamos asignar ID a la parte incluida, de esta manera en el enlace tendremos acceso a la subparte incluida
<include
    android:id="@+id/your_id"
    layout="@layout/some_layout" />

De esta manera en su código de actividad:

private lateinit var exampleBinding: ActivityExampleBinding  //activity_example.xml layout

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    exampleBinding = ActivityExampleBinding.inflate(layoutInflater)
    setContentView(exampleBinding.root)
    //we will be able to access included layouts view like this
    val includedView: View = exampleBinding.yourId.idOfIncludedView
//[...]
}
  1. Incluir con bloque de combinación en diseño externo. No podemos agregarle ID porque el bloque de combinación no es una vista. Digamos que tenemos un diseño de combinación eterno (merge_layout.xm):
<?xml version="1.0" encoding="utf-8"?>
<merge 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"
    tools:showIn="@layout/activity_example">

    <TextView
        android:id="@+id/some_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World" />
</merge>

Para vincular correctamente dicho diseño de combinación, necesitamos:

En tu código de actividad:

private lateinit var exampleBinding: ActivityExampleBinding  //activity_example.xml layout
private lateinit var mergeBinding: MergeLayoutBinding  //merge_layout.xml layout

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    exampleBinding = ActivityExampleBinding.inflate(layoutInflater)
    //we need to bind the root layout with our binder for external layout
    mergeBinding = MergeLayoutBinding.bind(exampleBinding.root)
    setContentView(exampleBinding.root)
    //we will be able to access included in merge layout views like this
    val mergedView: View = mergeBinding.someView
//[...]
}

  • tuvo que agregar el layout etiqueta dentro del archivo que contiene las vistas combinadas

    – Joao Carlos

    5 de junio de 2020 a las 13:49

  • Estoy tratando de hacer esto en un fragmento en lugar de una actividad y no funciona. Configuré global_header como id de mi elemento de inclusión y, de hecho, el autocompletado en Android Studio funciona perfectamente bien y autocompleta viewBindings.globalHeader, por lo que se genera para el enlace, pero luego en tiempo de ejecución se bloquea: ” java.lang.NullPointerException: Falta requerido ver con ID: com.daon.ps.daonsonboard:id/global_header”

    – Fran Marzoa

    28 de septiembre de 2020 a las 12:08

  • @FranMarzoa ¿Está seguro de que realiza todas las operaciones necesarias en Fragments onCreateView? me gusta: val binding = FrgamentSomethingSomething.inflate(layoutInflater) y return binding.root

    -Artur Kasprzak

    29 de septiembre de 2020 a las 13:12


  • @FranMarzoa También ten en cuenta que binding.globalHeader no devolverá la vista: será GlobalHeaderBinding (o lo que sea que haya llamado archivo con diseño) y dentro encontrará todas las vistas incluidas.

    -Artur Kasprzak

    29 de septiembre de 2020 a las 13:21

  • Se bloqueó mientras inflaba el diseño, ni siquiera tuve la oportunidad de acceder a él. De todos modos, encontré una solución y una buena explicación del problema aquí: stackoverflow.com/a/52343338/1160360

    – Fran Marzoa

    1 de octubre de 2020 a las 9:08


avatar de usuario
Emad Razavi

Con respecto a su primera pregunta, puede obtener un enlace de vista para el diseño incluido.

aquí hay una muestra main_fragment.xml expediente:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_view_main"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <include
        android:id="@+id/toolbar"
        layout="@layout/toolbar" />

</LinearLayout>

Y MainFragment.java puede ser asi:

public class MainFragment extends Fragment {

    private MainFragmentBinding binding;
    private ToolbarBinding toolbarBinding;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

        binding = MainFragmentBinding.inflate(inflater, container, false);
        toolbarBinding = binding.toolbar;

        return binding.getRoot();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        toolbarBinding = null;
        binding = null;
    }
}

Ahora tiene dos enlaces: uno corresponde al diseño principal y el otro corresponde al diseño incluido.

  • Respuesta muy simple y usa la nueva sintaxis: todo funciona para mí en una Actividad que no es Fragmento con una sintaxis similar en onCreate(). Gracias. (Solo tengo un poco de problemas para usar por un DrawerLayout)

    – Monje Gordo

    16 de abril de 2020 a las 14:38


  • Obtengo un NPE en tiempo de ejecución que dice que falta la vista requerida con ID blah.

    – Asim

    20 de mayo de 2020 a las 8:41

  • @Asim Tal vez si cambia su diseño incluido de fusionar a algún grupo de vista

    – Jesús Barrera

    28 de junio de 2020 a las 7:09

  • Me salvaste la vida

    – Mohammad Sommakia

    19 oct 2021 a las 8:03

avatar de usuario
Manav Adhyaru

Si desea vincular el diseño incluido, entonces,

Para actividad

YourMainLayoutBinding mainLayoutBinding = MainLayoutBinding.inflate(getLayoutInflater);

View view = mainLayoutBinding.getRoot();

YourIncludedLayoutBinding includedLayoutBinding = YourIncludedLayoutBinding.bind(View);

para fragmento

YourMainLayoutBinding mainLayoutBinding = MainLayoutBinding.inflate(inflater,container,false);

View view = mainLayoutBinding.getRoot();

YourIncludedLayoutBinding includedLayoutBinding = YourIncludedLayoutBinding.bind(View);

Asegúrese de que si la raíz principal principal de enlace de su diseño principal es LinearLayout, entonces, el diseño principal incluidoLayoutBinding también será un diseño lineal

  • No es necesario vincular explícitamente el diseño incluido, se realiza automáticamente si especifica una identificación para él: <include android:id="@+id/myToolbar" layout="@layout/toolbar" />. Después de eso, el campo mainLayoutBinding.myToolbar contendrá un enlace anidado.

    – Dmitri K.

    2 de junio de 2021 a las 14:07

  • @DmitryK en realidad es necesario, ya que de lo contrario Android Studio Arctic Fox da errores Cannot access class 'x'. Check your module classpath for missing or conflicting dependencies

    – Michał Dobi Dobrzański

    27 oct 2021 a las 8:27

avatar de usuario
shivang

Supongamos que incluí un diseño en mi activity_main.xml archivo de la siguiente manera:

<include
    android:id="@+id/ll_layout1"
    layout="@layout/layout1"
    android:visibility="gone" />

Y supongamos que quisiera cambiar su visibilidad. Puedo hacerlo de la siguiente manera:

activityMainBinding.llLayout1.root.visibility = View.VISIBLE

avatar de usuario
usuario1035292

Siga los pasos: –

  1. private val binding : FragmentBinding

    por viewBinding(FragmentBinding::bind)

  2. asegúrese de hacer lo siguiente en “onViewCreated(vista: Vista, estado de instancia guardado: ¿Paquete?)

     val binding2 = binding.root.include_layout_id
    

p.ej val binding2 = binding.root.tool_bar_layout

Ahora acceda a su diseño incluido, vistas aquí. p.ej

binding2.textView.text = "your text"

avatar de usuario
davidups

En el diseño de inclusión, debe crear un diseño de contenedor y poner aquí la identificación.

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/example"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="parent">
    </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

avatar de usuario
TrucLC

Uso de la biblioteca de enlace de datos. Luego envuelva su diseño XML con <layout> etiqueta

actividad_principal.xml

<?xml version="1.0" encoding="utf-8"?>
<layout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    ... 

    <include 
      android:id="@+id/toolbar"
      layout="@layout/toolbar" />
    
    ...

</LinearLayout>
</layout>

barra de herramientas.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ImageView 
        android:id="@+id/ivImage"
        ... />

    <TextView 
        android:id="@+id/tvTitle"
        ... />


</LinearLayout>

MainActivity.kt

private lateinit var binding: ActivityMainBinding  

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = DataBindingUtil.setContentView(this, R.layout.activity_main)

    // Access include layout views
    binding.toolbar.rootView.ivImage.setImageResource(R.drawable.ic_back_arrow)
    binding.toolbar.rootView.tvTitle.text = getString(R.string.home)
   
    ...
}

  • La pregunta es sobre ViewBinding no DataBinding

    -Artur Kasprzak

    25 de julio de 2021 a las 10:59


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad