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 View
s 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
}
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);
La TextView
avec l'ID text123
doit être déclarée à l'intérieur de la Layout
que vous avez définie avec setContentView
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();
}
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 ..