web-dev-qa-db-fra.com

findViewById () renvoie null pour les vues dans une boîte de dialogue

Le problème est que peu importe où et comment j'appelle les composants de cette mise en page, ils renvoient toujours null.

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

Cela fonctionne bien. Il affiche la disposition à l'intérieur de la Dialog, mais les enfants sont toujours retournés comme nuls par findViewById(R.id.some_search_layout_children).

J'ai essayé de nettoyer mon projet plusieurs fois, d'implémenter une autre classe pour ma Dialog, appelée findViewById() en tant que membre de ma Activity principale, dans la méthode initSearch() et dans une implémentation anonyme de OnClickListener pour la Dialog, mais toutes avec la même chose. résultat. J'ai également essayé de diviser les enfants en Views indépendants et de les appeler par programme:

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

Mais encore une fois, le même résultat.

C'est le code pertinent:

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();
    }

Cette ligne:

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

renvoie toujours null, peu importe comment et où il est appelé - globalement, final local, etc. - il renvoie simplement null.

Voici le code XML de ma disposition Dialog personnalisée:

<?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>

Ceci est mon fichier R.Java:

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
}
11
Fer

L'appel de findViewById() recherchera les vues dans votre vue Activité mise en page et pas dans la boîte de dialogue. Vous devez appeler findViewById() sur la View spécifique que vous avez définie comme structure de votre boîte de dialogue.

Essaye ça

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();
}

Remarquez comment je gonfle la vue et la stocke dans une View nommée dialogView. Ensuite, pour trouver votre EditText nommée tagField, j'utilise dialogView.findViewById(R.id.tagField);

38
dymmeh

La TextView avec l'ID text123 doit être déclarée à l'intérieur de la Layout que vous avez définie avec setContentView

2
Blackbelt

Votre problème est que vous essayez d'exécuter .show() sur un générateur AlertDialog, et non pas sur AlertDialog lui-même.

Essayez le code suivant:

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();
}
0
TronicZomB

J'ai eu exactement le même problème lors de la programmation d'une application multilingue. Finalement, j'ai découvert que j'avais oublié de mettre à jour les étiquettes dans les fichiers d'activité [xml] de certains modèles.

J'en avais 3 par activité:

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

Je n'ai mis à jour que le premier et j'ai oublié de mettre à jour l'autre comme suit:

Tous les trois avaient un seul TextView avec l'id de:

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

Ensuite, j'ai changé le nom de l'id de cette vue de texte - uniquement dans le premier fichier - en:

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

Et bien sûr, dans le code Java de l'Activité (qui utilise les trois ...):

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

Cela a fonctionné pour la version régulière (en anglais <activity_name>.xml).

Mais quand je suis allé au langage IW (en hébreu <activity_name>xml(iw)) tv a une valeur nulle et j'ai même eu quelques béguin.

Lorsque j'ai changé l'identifiant d'affichage de texte des autres fichiers en "@+id/status_textbox", tout a fonctionné comme un charme ...

Alors, assurez-vous simplement que tous vos identifiants sont mis à jour et comptabilisés dans toutes vos présentations et toutes vos langues.

Cela a résolu mon problème quand même ..

0
JamesC