El problema es que, no importa donde o como la llamo yo para esto del diseño de los componentes, que siempre devuelve null.

setView(inflater.inflate(R.layout.search_layout, null))

Esto funciona bien. Se muestra el diseño dentro de la Dialog, sin embargo, los niños siempre se devuelven como nulo por findViewById(R.id.some_search_layout_children).

He probado a limpiar mi proyecto varias veces, trató de implementar otra clase para mi Dialog, llamado findViewById() como un miembro de mi principal Activity, dentro de la initSearch() método, y dentro de un anónimo implementación de OnClickListener para la Dialog, pero todos con el mismo resultado. También he tratado de romper los niños en independiente Views y programación llamando a ellos:

TextView text = (TextView) findResourceById(R.id.new_independant_textview);

Pero, de nuevo, el mismo resultado.

Este es el código correspondiente:

public class Xyz extends Activity {
    public void onCreate(...) { //some listener will trigger initSearch() }

    private void initSearch() {
        AlertDialog.Builder searchDialog = new AlertDialog.Builder(this);
        LayoutInflater inflater = this.getLayoutInflater();
        searchDialog.setTitle("Search Photos");
        searchDialog.setMessage("Specify tag and value...");
        //R.layout.search_dialog is my custom layour, it displays fine, it works. 
        searchDialog.setView(inflater.inflate(R.layout.search_dialog, null));
        EditText tagText = (EdiText) findViewById(R.id.tagField); //WILL RETURN NULL
        searchDialog.setPositiveButton( ... ) ...
        searchDialog.show();
    }

Esta línea:

 EditText text = (EditText) findViewById(R.id.tagField);

siempre devuelve un valor nulo, no importa cómo o dónde se llama – a nivel mundial, local final, etc. – sólo devuelve null.

Aquí es el XML de mi costumbre Dialog diseño:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/search_dialog"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical" >
    <TextView
        android:id="@+id/tagText" 
        android:padding="7dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="14sp"
        android:text="@string/tag" />
    <EditText 
        android:id="@+id/tagField"
        android:padding="7dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="text"/>
    <TextView
        android:id="@+id/valueText" 
        android:padding="7dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="14sp"
        android:text="@string/value" />
    <EditText 
        android:id="@+id/valueField"
        android:padding="7dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="text"/>
</LinearLayout>

Este es mi R.java de archivo:

public static final class id {
    public static final int action_settings=0x7f0a0011;
    public static final int add_album=0x7f0a0001;
    public static final int add_photo=0x7f0a000d;
    public static final int albums_list=0x7f0a0003;
    public static final int delete_album=0x7f0a000b;
    public static final int exit_finder=0x7f0a000f;
    public static final int new_directory=0x7f0a000e;
    public static final int open_album=0x7f0a000a;
    public static final int photos_grid=0x7f0a0000;
    public static final int rename_album=0x7f0a000c;
    public static final int search_dialog=0x7f0a0004;
    public static final int search_icon=0x7f0a0002;
    public static final int splash_rutgers=0x7f0a0009;
    public static final int tagField=0x7f0a0006; //problematic
    public static final int tagText=0x7f0a0005; / problematic
    public static final int terminate_app=0x7f0a0010;
    public static final int valueField=0x7f0a0008; //problematic
    public static final int valueText=0x7f0a0007; //problematic
}
usted wana vista de búsqueda en el cuadro de diálogo llamadas findViewById de otra actividad … buena suerte …
Suena interesante,pero no estoy fuly la comprensión de por qué necesito una nueva actividad. Entonces, ¿por qué R. layot.search_dialog devuelve el derecho layour sin embargo, es que los niños son nulos? No existe coherencia.

OriginalEl autor Fer | 2013-04-24

4 Comentarios

  1. 39

    Llamar findViewById() buscará puntos de vista dentro de su Actividad diseño y no el cuadro de diálogo de la vista. Usted necesita llamar a findViewById() en el específico View que establece como la del cuadro de diálogo diseño.

    Probar este

    private void initSearch() {
        AlertDialog.Builder searchDialog = new AlertDialog.Builder(this);
        LayoutInflater inflater = this.getLayoutInflater();
        searchDialog.setTitle("Search Photos");
        searchDialog.setMessage("Specify tag and value...");
        //R.layout.search_dialog is my custom layour, it displays fine, it works. 
        View dialogView = inflater.inflate(R.layout.search_dialog, null);
        searchDialog.setView(dialogView);
        EditText tagText = (EdiText) dialogView.findViewById(R.id.tagField); 
        searchDialog.setPositiveButton( ... ) ...
        AlertDialog myAlert = searchDialog.create(); //returns an AlertDialog from a Builder.
        myAlert.show();
    }

    Aviso cómo me estoy inflando la vista y su almacenamiento en una View nombre dialogView. Entonces, para encontrar su EditText nombre tagField, estoy usando dialogView.findViewById(R.id.tagField);

    Derecho de respuesta. Gracias chicos.

    OriginalEl autor dymmeh

  2. 2

    La TextView con id text123 tiene que ser declarado en el interior de la Layout establece con setContentView

    En realidad, creo que text123 estaba destinado a ser un ejemplo, porque el OP ha EditText tagText = (EdiText) findViewById(R.id.tagField); // WILL RETURN NULL en sus «principales» de la sección del código. Pero esta respuesta me hizo reír. +1.
    He leído este EditText texto = (EditText) findViewById(R. id.text123); // devuelve null, SIEMPRE
    ¿has probado algo como EditText text = (EditText) getDialog().findViewById()?
    dentro de initSearc(), después de setTitle y setMessage que usted puede hacer: AlertDialog de diálogo = searchDialog.crear(); cuadro de diálogo.setContentView(R. layout.search_dialog); cuadro de diálogo.findViewById(R. id.tagField); se debe trabajar. Tiene para mí
    Ambos TronicZomB y blackbelt golpe en la uña. Gracias compañeros, para su conocimiento. Me faltaba el contexto de un diálogo real.

    OriginalEl autor Blackbelt

  3. 0

    Su problema es que usted está tratando de hacer .show() en un AlertDialog Generador, no la AlertDialog sí mismo.

    Tratar el siguiente código:

    public class Xyz extends Activity {
    public void onCreate(...) { //some listener will trigger initSearch() }
    
    private void initSearch() {
        AlertDialog.Builder searchDialog = new AlertDialog.Builder(this);
        LayoutInflater inflater = this.getLayoutInflater();
        searchDialog.setTitle("Search Photos");
        searchDialog.setMessage("Specify tag and value...");
        //R.layout.search_dialog is my custom layour, it displays fine, it works. 
        searchDialog.setView(inflater.inflate(R.layout.search_dialog, null));
        EditText tagText = (EdiText) findViewById(R.id.tagField); //WILL RETURN NULL
        searchDialog.setPositiveButton( ... ) ...
        AlertDialog myAlert = searchDialog.create(); //returns an AlertDialog from a Builder.
        myAlert.show();
    }
    En realidad, es posible llamar a show() en un Builder, solo crea la AlertDialog y se lo muestra. developer.android.com/reference/android/app/…
    Ah ok. Yo no sabía que. Gracias!
    Buen enfoque, aunque. La solución es Crear un shell de Diálogo, crear instancias de ella con el Constructor, setContentView en el cuadro de Diálogo, setView en el Generador, entonces findViewById en el cuadro de diálogo de la instancia.
    oh gracias! Yo normalmente uso DialogFragments y acabo de volver de las builder.create() y, a continuación, mostrar que cuando me necesitan y por lo tanto no sabía que .show() creará y mostrará en una línea. Aunque es bueno saber.

    OriginalEl autor TronicZomB

  4. 0

    Tuve exactamente el mismo problema, mientras que la programación de una aplicación multilingüe.
    Finalmente me enteré de que me olvidé de actualizar las etiquetas en algunos del diseño de la actividad [xml] archivos.

    Tuve 3 de ellos por actividad:

    <activity_name>.xml
    <activity_name>.xml(land)
    <activity_name>.xml(iw)

    He actualizado, sólo la primera y se olvidó de la actualización de otro de la siguiente manera:

    Los tres tenían el TextView con la identificación de:

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

    Luego he cambiado el nombre de la id de la vista de texto – sólo en el primer archivo a:

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

    Y, de curso, en la Actividad de Java de código (que utiliza los tres…):

        TextView tv = findViewByID(R.id.status_textbox);

    Esta trabajado para la regular (inglés <activity_name>.xml) versión.

    Pero cuando fui el IW idioma (hebreo <activity_name>xml(iw)) tv consiguió valor nulo e incluso tengo algunos aplasta.

    Cuando he cambiado la vista de texto id de los otros archivos a "@+id/status_textbox" todo funcionó como un encanto…

    Así, simplemente asegúrese de que todos los IDs se actualizan y explicado en todos sus diseños e idiomas.

    Esta solucionado mi problema de todos modos..

    OriginalEl autor JamesC

Dejar respuesta

Please enter your comment!
Please enter your name here