En un archivo XML, se puede asignar un ID a ver como android:id="@+id/something" y, a continuación, llamar a findViewById(), pero a la hora de crear una vista mediante programación, ¿cómo puedo asignar un ID?

Creo setId() no es el mismo como por omisión. setId() es un extra.

Puede que alguien me corrija?

InformationsquelleAutor DuyguK | 2011-12-10

3 Comentarios

  1. 510

    Android id resumen

    Un Android id es un entero comúnmente utilizado para identificar puntos de vista; este id puede ser asignado a través de XML (cuando sea posible) y a través de código (en programación.) El id es el más útil para obtener referencias para XML definido por el Views generados por un Inflater (como el uso de setContentView.)

    Asignar id a través de XML

    • Agregar un atributo de android:id="@+id/somename" de su punto de vista.
    • Cuando la aplicación está construida, el android:id será asignado a un único int para utilizar en el código.
    • Referencia a su android:id‘s int valor en el código mediante «R.id.somename» (efectivamente una constante.)
    • este int puede cambiar de build para crear así nunca se copia de una identificación de de gen/paquete.nombre/R.java, sólo tiene que utilizar «R.id.somename».
    • (También, un id asignado a un Preference en XML no se usa cuando el Preference genera su View.)

    Asignar id a través de código (programación)

    • Establecer manualmente ids usando someView.setId(int);
    • La int debe ser positivo, pero de lo contrario es arbitrario, puede ser lo que usted desea (seguir leyendo si esto es espantoso.)
    • Por ejemplo, si la creación y la numeración de varios puntos de vista que representan a los elementos, puede utilizar su número de elemento.

    Singularidad de ids

    • XMLasignado ids será único.
    • Código asignado por ids hacer no tiene que ser único
    • Código asignado por ids puede (teóricamente) el conflicto con XMLasignado ids.
    • Estas conflicto ids no importa si consultan correctamente (seguir leyendo).

    Cuando (y por qué) en conflicto ids no importa

    • findViewById(int) se repite en profundidad de forma recursiva a través de la vista de la jerarquía de desde el punto de Vista de especificar y devuelve la primera View se encuentra con un juego id.
    • Mientras no hay ningún código asignado por ids asignados antes de un XML definido por el id en la jerarquía, findViewById(R.id.somename) siempre devuelve el XML definido por el punto de Vista de forma id‘d.

    De forma dinámica en la Creación de Vistas y la Asignación de IDs

    • En el diseño de XML, definir un vacío ViewGroup con id.
    • Como un LinearLayout con android:id="@+id/placeholder".
    • Utilizar código para llenar el marcador de posición ViewGroup con Views.
    • Si usted necesita o desea, asigne cualquier ids que son convenientes para cada vista.
    • Consulta de estas vistas con marcador de posición.findViewById(convenientInt);

    • API 17 introducido View.generateViewId() que le permite generar un IDENTIFICADOR único.

    Si usted decide mantener las referencias a sus puntos de vista en torno a, asegúrese de crear una instancia con getApplicationContext() y asegúrese de ajustar cada una referencia a null en onDestroy. Al parecer fugas la Activity (colgando en el que después es destruida) es un desperdicio.. 🙂

    Reserva un XML android:id para utilizar en el código

    API 17 introducido View.generateViewId() que genera un IDENTIFICADOR único. (Gracias a la adopción posibilidades de hacer cambios para señalar esto.)*

    Si su ViewGroup no puede ser definido a través de XML (o no quieres que lo sea) se puede reservar la identificación a través de XML para asegurarse de que sigue siendo única:

    Aquí, values/ids.xml define una costumbre id:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <item name="reservedNamedId" type="id"/>
    </resources>

    , A continuación, una vez que el ViewGroup o punto de Vista ha sido creado, puede adjuntar el id personalizado

    myViewGroup.setId(R.id.reservedNamedId);

    Conflicto id ejemplo

    Para mayor claridad por medio de la ofuscación de ejemplo, vamos a examinar lo que sucede cuando hay un id conflicto detrás de las escenas.

    layout/mylayout.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" >
        <LinearLayout
            android:id="@+id/placeholder"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
    </LinearLayout>

    Para simular un conflicto, digamos que nuestra última construir asignado R.id.placeholder(@+id/placeholder) un int valor de 12..

    Siguiente, MyActivity.java define algunos añade puntos de vista mediante programación (a través de código):

    int placeholderId = R.id.placeholder; //placeholderId==12
    //returns *placeholder* which has id==12:
    ViewGroup placeholder = (ViewGroup)this.findViewById(placeholderId);
    for (int i=0; i<20; i++){
        TextView tv = new TextView(this.getApplicationContext());
        //One new TextView will also be assigned an id==12:
        tv.setId(i);
        placeholder.addView(tv);
    }

    Así placeholder y uno de nuestros nuevos TextViews ambos tienen un id de 12! Pero esto no es realmente un problema si se consulta marcador de posición del niño vistas:

    //Will return a generated TextView:
     placeholder.findViewById(12);
    
    //Whereas this will return the ViewGroup *placeholder*;
    //as long as its R.id remains 12: 
    Activity.this.findViewById(12);

    *No es tan malo

    • Además de esto, podría ser útil para alguien, en la codificación similar soluciones que ser conscientes de Vista.generateViewId() de la API > 17 para que no cree conflictos IDs
    • Tenga en cuenta que findViewById hace una profundidad de exploración, por lo que «mientras no hay ningún código asignado asignado un id por encima de un XML definido por el id de la jerarquía» no es técnicamente correcto; es «antes de» en lugar de «arriba».
    • wiresareobsolete.com/2011/04/manufacturing-ids
    • En las versiones más recientes de Android developer tools, mediante programación configuración de la ID a un valor arbitrario será marcado como un error del compilador. El valor que se espera para ser un IDENTIFICADOR de recurso.
    • Creo que esto incluso fue el caso cuando me respondió esto hace cinco años – es por eso que el id personalizado tuvo que ser definido en ids.xml . Para realmente arbitraria IDENTIFICACIÓN, uso View.generateViewId() (API 17). (Por favor aclarar su punto, si he perdido.)
    • > (También, un id asignado a una Preferencia en XML no se utiliza cuando la Preferencia genera su punto de Vista.) Muy interesado en eso. Mi código hereda de PreferenceDialogFragmentCompat parece como identificadores de R.id no coinciden con los de la vista de jerarquía. De esta manera no puedo encontrar la vista por ID.

  2. 6

    Puedes usar el View.setId(integer) para esto. En el XML, a pesar de que usted está estableciendo una Cadena de identificación, este se convierte en un entero. Debido a esto, usted puede usar cualquiera (positivo) Entero para el Views agregar mediante programación.

    Según View documentación

    El identificador no tiene que ser único en esta vista de la jerarquía.
    El identificador debe ser un número positivo.

    Así que usted puede utilizar cualquier número entero positivo que te gusta, pero en este caso no
    puede haber algunos puntos de vista con los equivalentes de identificación. Si usted desea buscar para algunos
    vista de la jerarquía de llamadas a setTag con algunos objetos clave puede ser
    a la mano.

    Créditos a esta respuesta.

  3. 5

    Sí, usted puede llamar setId(value) en cualquier vista con un (positivo) valor entero que te gusta y luego encontrar en el contenedor primario utilizando findViewById(value). Tenga en cuenta que es válido para llamar a setId() con el mismo valor para los diferentes hermano puntos de vista, pero findViewById() devolverá sólo el primero.

    • Tenga en cuenta que usted tiene que utilizar un número entero mayor que cero.
    • +1 para el «encontramos en el contenedor primario» parte
    • a pesar de que findViewById(int) se repite recursivamente a través de la vista de jerarquía desde el punto de Vista de especificar y devolver el primer punto de Vista se encuentra con una coincidencia de id especificado en la 1ª respuesta es más precisa.
    • Sí, llamando findViewById en un ancestro conocido es una buena idea por razones de rendimiento, pero no es garantía de que va a encontrar una inmediata niño si hay uno con el ID correcto.
    • Por qué??? y si puedo configurar el id de cero???

Dejar respuesta

Please enter your comment!
Please enter your name here