2017-09-28 16 views
1

Salutations Stack Overflow CommunautéEn utilisant LayoutInflater.inflate() pour créer un Toast personnalisé dans Android

Lorsque vous créez une coutume Toast le android developer guide ainsi que ce stack overflow post, les deux fournissent l'exemple suivant:

my_custom_toast. xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/toast_container" 
      android:orientation="horizontal" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      > 
    <ImageView android:src="@drawable/droid" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       /> 
    <TextView android:id="@+id/text" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       /> 
</LinearLayout> 

MainActivity.java

LayoutInflater inflater = getLayoutInflater(); 
View layout = inflater.inflate(
    R.layout.my_custom_toast, 
    (ViewGroup) findViewById(R.id.toast_container) 
); 

TextView text = (TextView) layout.findViewById(R.id.text); 
text.setText("This is a custom toast"); 

Toast toast = new Toast(getApplicationContext()); 
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0); 
toast.setDuration(Toast.LENGTH_LONG); 
toast.setView(layout); 
toast.show(); 

A Quelques notes

Si le second argument est nul, alors inflate() devrait revenir à la racine du fichier XML, qui est le LinearLayout appelé toast_container. Sinon, si un ViewGroup est passé comme second argument, inflate() doit attacher la hiérarchie gonflée à ce ViewGroup et renvoyer le ViewGroup fourni (qui est maintenant le parent de la disposition gonflée).

J'ai 2 questions:

Première:

Quel est le but de fournir un second argument? Par défaut, LinearLayout avec l'ID @+id/toast_container sera retourné si nous passons null.

Deuxième: à l'un de ses propres membres

Comment la hiérarchie gonflé peut être gonflé (et intégré)? Ou, l'utilisation de gonfler() ci-dessus est-elle considérée comme incorrecte? En d'autres termes, ce code gonfle (et incorpore) la disposition dans l'un de ses propres membres, c'est-à-dire LinearLayout (vérifier @+id/toast_container). Ceci duplique le LinearLayout en gonflant le fichier xml dans un second LinearLayout.

+0

Dans le cadre de ces normes de site Web, veuillez éviter de poser plus d'une question par article, car cela rendrait la réponse et le vote plus compliqués. –

Répondre

0

En répondant à votre première question, le gonflage de la vue utilisera le deuxième paramètre afin de faire quelques étapes correctement. Principalement à faire avec les classes LayoutParams (plusieurs classes d'affichage ont une classe correspondante LayoutParams). Si vous essayez d'utiliser des marges, celles-ci ne fonctionneront probablement que si vous avez passé le second paramètre.

Question 2: Vous avez mal compris la documentation. Si vous passez le second paramètre ViewGroup que j'appellerai 'parent', votre mise en page sera gonflée en 'parent' et la fonction retournera 'parent'.

Dans le cas où vous ne passez pas le deuxième paramètre, la fonction gonfle votre mise en page et renvoie la mise en page elle-même (la vue racine/supérieure).

+0

Concernant la question 2: ** Je suis entièrement d'accord avec ce que vous dites **. Mais, si le seul but du second argument est d'inférer le type de ViewGroup.LayoutParams, alors ils auraient dû utiliser 'gonfler (R.layout.xml_file, ViewGroup, false)'. De cette façon, le type LayoutParams sera déduit (selon la documentation).Mon problème est, ils gonflent (et incorporent) la disposition gonflée dans un de ses propres membres, c'est la disposition linéaire (vérifiez @ + id/toast_container). Ils dupliquent la linearlayout en gonflant le fichier xml dans un second LinearLayout. C'est ce que je voulais dire par la question 2. – Maged

+0

Voici la documentation à laquelle je faisais référence. https://developer.android.com/reference/android/view/LayoutInflater.html#inflate%28int%2C%20android.view.ViewGroup%2C%20boolean%29 – Maged