Comment gonfler une vue avec une mise en page

221

J'ai une mise en page définie en XML. Il contient également:

<RelativeLayout
    android:id="@+id/item"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
/>

Je voudrais gonfler ce RelativeView avec un autre fichier de disposition XML. Je peux utiliser différentes mises en page en fonction d'une situation. Comment dois-je procéder? J'essayais différentes variantes de

RelativeLayout item = (RelativeLayout) findViewById(R.id.item);
item.inflate(...)

Mais aucun d'entre eux n'a bien fonctionné.

Michal Dymel
la source

Réponses:

390

Je ne suis pas sûr d'avoir suivi votre question - essayez-vous de joindre une vue enfant au RelativeLayout? Si c'est le cas, vous voulez faire quelque chose comme:

RelativeLayout item = (RelativeLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, null);
item.addView(child);
Graeme Duncan
la source
3
J'obtiens une erreur: 02-25 22: 21: 19.324: ERREUR / AndroidRuntime (865): Causé par: java.lang.IllegalStateException: l'enfant spécifié a déjà un parent. Vous devez d'abord appeler removeView () sur le parent de l'enfant.
Michal Dymel
27
Je viens d'essayer cela maintenant, j'avais besoin de: View child = getLayoutInflater (). Inflate (R.layout.child, null);
James
3
Le problème n'est pas le code. Il est assez facile de suivre le code. Où créez-vous le fichier xml. le type est-il une ressource de style de thème? le problème que je pense que les gens que j'ai inclus est où allons-nous placer ce fichier xml
Lpc_dark
15
Ce n'est pas parfait. La version 3 paramètres du gonfleur doit être utilisée - voici pourquoi: doubleencore.com/2013/05/layout-inflation-as-intended
Nick Cardoso
3
La réponse est incorrecte, même si cela fonctionne. Veuillez consulter cet article possiblemobile.com/2013/05/layout-inflation-as-intended
ARK
107

Vous gonflez une ressource XML. Voir le doc LayoutInflater .

Si votre mise en page est dans un mylayout.xml , vous feriez quelque chose comme:

View view; 
LayoutInflater inflater = (LayoutInflater)   getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
view = inflater.inflate(R.layout.mylayout, null);

RelativeLayout item = (RelativeLayout) view.findViewById(R.id.item);
ccheneson
la source
4
J'ai ma vue principale gonflée. Le problème est que je veux en gonfler une partie à partir d'un autre fichier XML. Cet élément RelativeLayout fait partie d'une plus grande mise en page et je veux le remplir avec la mise en page d'un autre fichier XML.
Michal Dymel
hum je suis désolé alors je n'ai aucune idée :(. Utilisez-vous quelque chose comme <include> dans votre vue principale pour inclure une autre mise en page?
ccheneson
Non, c'est une mise en page simple. Je pense que je vais simplement ajouter mes éléments par programmation - sans XML. Merci pour l'aide!
Michal Dymel
27

Bien que la réponse soit tardive, mais j'aimerais ajouter cette façon d'obtenir ce

LayoutInflater layoutInflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view = layoutInflater.inflate(R.layout.mylayout, item );

itemest la disposition parent à laquelle vous souhaitez ajouter une disposition enfant.

Shaista Naaz
la source
(encore plus tard encore) J'ai du mal à mettre en œuvre votre réponse. J'ai essayé le code que vous avez mentionné ci-dessus mais j'ai remplacé 'item' par: 'R.layout.activity_layout' J'obtiens un "Il n'y a pas de méthode applicable à '(int, int)'" pourrais-je vous déranger pour vos pensées?
Kyle
1
@Kyle - encore plus tard encore. Vous ne pouvez pas utiliser les Rressources comme références à un objet, ce ne sont que des ints. Vous devez utiliser en lui findViewByIdtransmettant la Rressource, puis tapez la convertir en l'objet souhaité. Ensuite, vous pouvez l'utiliser dans des appels de fonction comme inflate. (c'est-à-dire ViewGroup item = (ViewGroup) findViewById(R.layout.activity_layout);... alors vous pouvez utiliser itemcomme ci-dessus.)
Pimp Trizkit
Je suppose que je ment à utiliser RelativeLayoutau lieu de ViewGrouplà dans mon exemple ci-dessus, car vous ne pouvez pas instancier la classe de base ViewGroup. La règle d'édition de 5 minutes m'a eu. lol
Pimp Trizkit
Est-il possible de masquer le parent et d'afficher uniquement la vue enfant
NovusMobile
Merci, cette méthode m'a aidé à ne pas utiliser getContext () dans l'exemple précédent, car j'utilise des fragments.
RightHandedMonkey
19

Il est utile d'ajouter à cela, même s'il s'agit d'un ancien article, que si la vue enfant qui est gonflée à partir de xml doit être ajoutée à une disposition de groupe de vues, vous devez appeler gonfler avec un indice de quel type de groupe de vues il va à ajouter. Comme:

View child = getLayoutInflater().inflate(R.layout.child, item, false);

La méthode de gonflement est assez surchargée et décrit cette partie de l'utilisation dans les documents. J'ai eu un problème où une seule vue gonflée à partir de xml ne s'alignait pas correctement dans le parent jusqu'à ce que j'effectue ce type de modification.

Maximus
la source
Enfin, merci :) Cela permet d'ajouter plusieurs vues à un seul parent, mais sans avoir à se soucier des LayoutParams - qui sont lus à partir du XML. Bon travail!
Sabo
13

Un moyen encore plus simple consiste à utiliser

View child = View.inflate(context, R.layout.child, null)
item.addChild(child) //attach to your item
Ashish Rawat
la source
L'utilisation View.inflate()est le meilleur moyen, pas de nuisance inutile LayoutInflaterou getSystemService(Context.LAYOUT_INFLATER_SERVICE)de tout cela! : D
varun
8

inflation de la mise en page

View view = null;
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
view = inflater.inflate(R.layout.mylayout, null);
main.addView(view);
Happy Singh
la source
6

Si vous n'êtes pas dans une activité, vous pouvez utiliser la from()méthode statique de la LayoutInflaterclasse pour obtenir un LayoutInflater, ou demander également le service à partir de la méthode de contexte getSystemService():

LayoutInflater i;
Context x;       //Assuming here that x is a valid context, not null

i = (LayoutInflater) x.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//OR
i = LayoutInflater.from(x);

(Je sais que c'est il y a presque 4 ans, mais mérite d'être mentionné)

Juan Cortés
la source
4

Si vous souhaitez ajouter une seule vue plusieurs fois, vous devez utiliser

   layoutInflaterForButton = getActivity().getLayoutInflater();

 for (int noOfButton = 0; noOfButton < 5; noOfButton++) {
        FrameLayout btnView = (FrameLayout) layoutInflaterForButton.inflate(R.layout.poll_button, null);
        btnContainer.addView(btnView);
    }

Si vous aimez

   layoutInflaterForButton = getActivity().getLayoutInflater();
    FrameLayout btnView = (FrameLayout) layoutInflaterForButton.inflate(R.layout.poll_button, null);

et

for (int noOfButton = 0; noOfButton < 5; noOfButton++) {
            btnContainer.addView(btnView);
        }

alors il lèvera l'exception de toute vue ajoutée prête.

John Smith
la source
4

AttachToRoot Set à True

Pensez simplement que nous avons spécifié un bouton dans un fichier de disposition XML avec sa largeur et sa hauteur de disposition définies sur match_parent.

<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/custom_button">
</Button>

Sur ces boutons, cliquez sur l'événement, nous pouvons définir le code suivant pour gonfler la disposition de cette activité.

LayoutInflater inflater = LayoutInflater.from(getContext());
inflater.inflate(R.layout.yourlayoutname, this);

J'espère que cette solution fonctionne pour vous.!

eSparkBiz Team
la source
3

Essayez ce code:

  1. Si vous souhaitez simplement gonfler votre mise en page:

View view = LayoutInflater.from(context).inflate(R.layout.your_xml_layout,null); // Code for inflating xml layout
RelativeLayout item = view.findViewById(R.id.item);   

  1. Si vous souhaitez gonfler votre mise en page dans le conteneur (mise en page parent):

LinearLayout parent = findViewById(R.id.container);        //parent layout.
View view = LayoutInflater.from(context).inflate(R.layout.your_xml_layout,parent,false); 
RelativeLayout item = view.findViewById(R.id.item);       //initialize layout & By this you can also perform any event.
parent.addView(view);             //adding your inflated layout in parent layout.

Rohit Mhatre
la source
2

J'ai eu le plus de mal avec cette erreur, à cause de ma situation unique, mais j'ai finalement trouvé une solution.

Ma situation: j'utilise une vue séparée (XML) qui contient un WebView, puis s'ouvre dans un AlertDialoglorsque je clique sur un bouton dans ma vue d'activité principale. Mais d'une manière ou d'une autre, cela WebViewappartenait à la vue d'activité principale (probablement parce que je tire la ressource d'ici), donc juste avant de l'attribuer à ma AlertDialog(en tant que vue), je devais obtenir le parent de mon WebView, le mettre dans un ViewGroup, puis supprimez toutes les vues à ce sujet ViewGroup. Cela a fonctionné et mon erreur a disparu.

// set up Alert Dialog box
AlertDialog.Builder alert = new AlertDialog.Builder(this);
// inflate other xml where WebView is
LayoutInflater layoutInflater = (LayoutInflater)this.getSystemService
                (Context.LAYOUT_INFLATER_SERVICE);
View v = layoutInflater.inflate(R.layout.your_webview_layout, null);
final WebView webView = (WebView) v.findViewById(R.id.your_webview_id);

// more code...

.... plus tard après avoir chargé mon WebView....

// first, remove the parent of WebView from it's old parent so can be assigned a new one.
ViewGroup vg = (ViewGroup) webView.getParent();
vg.removeAllViews();

// put WebView in Dialog box
alert.setView(webView);
alert.show();
Azurespot
la source
2

Si vous essayez d'attacher une vue enfant à RelativeLayout? vous pouvez faire en suivant

RelativeLayout item = (RelativeLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, item, true);
Kasim Rangwala
la source
1

Avec Kotlin, vous pouvez utiliser:

val content = LayoutInflater.from(context).inflate(R.layout.[custom_layout_name], null)

[your_main_layout].apply {
    //..
    addView(content)
}
Hasan A Yousef
la source
-1

J'avais utilisé l'extrait de code ci-dessous pour cela et cela a fonctionné pour moi.

LinearLayout linearLayout = (LinearLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, null);
linearLayout.addView(child);
SFDCCoder
la source