So blasen Sie eine Ansicht mit einem Layout auf

221

Ich habe ein Layout in XML definiert. Es enthält auch:

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

Ich möchte diese RelativeView mit einer anderen XML-Layoutdatei aufblasen. Ich kann je nach Situation unterschiedliche Layouts verwenden. Wie soll ich das machen Ich habe verschiedene Variationen von ausprobiert

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

Aber keiner von ihnen hat gut funktioniert.

Michal Dymel
quelle

Antworten:

390

Ich bin nicht sicher, ob ich Ihrer Frage gefolgt bin. Versuchen Sie, dem RelativeLayout eine untergeordnete Ansicht hinzuzufügen? Wenn ja, möchten Sie etwas in der Art von:

RelativeLayout item = (RelativeLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, null);
item.addView(child);
Graeme Duncan
quelle
3
Ich erhalte eine Fehlermeldung: 02-25 22: 21: 19.324: ERROR / AndroidRuntime (865): Auslöser: java.lang.IllegalStateException: Das angegebene Kind hat bereits ein Elternteil. Sie müssen removeView () zuerst auf dem übergeordneten Element des Kindes aufrufen.
Michal Dymel
27
Ich habe es gerade versucht und brauchte: View child = getLayoutInflater (). Inflate (R.layout.child, null);
James
3
Das Problem ist nicht der Code. Es ist ziemlich einfach, Code zu folgen. Wo machst du die XML-Datei? Ist der Typ eine Ressource im Themenstil? Das Problem, das ich denke, Leute, die ich eingeschlossen habe, ist, wo wir diese XML-Datei platzieren
Lpc_dark
15
Das ist nicht perfekt. Die 3-Parameter-Version des Inflaters sollte verwendet werden - hier ist der Grund: doubleencore.com/2013/05/layout-inflation-as-intended
Nick Cardoso
3
Die Antwort ist falsch, auch wenn es funktioniert. Bitte überprüfen Sie diesen Beitrag possiblemobile.com/2013/05/layout-inflation-as-intended
ARK
107

Sie blasen eine XML-Ressource auf. Siehe das LayoutInflater-Dokument .

Wenn sich Ihr Layout in einem befindet mylayout.xml befindet , würden Sie Folgendes tun:

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
quelle
4
Ich habe meine Hauptansicht aufgeblasen. Das Problem ist, dass ich einen Teil davon aus einer anderen XML-Datei aufblasen möchte. Dieses Element RelativeLayout ist Teil eines größeren Layouts und ich möchte es mit einem Layout aus einer anderen XML-Datei füllen.
Michal Dymel
hum Es tut mir leid, dann habe ich keine Ahnung :(. Verwenden Sie so etwas wie <include> in Ihrer Hauptansicht, um ein anderes Layout aufzunehmen?
ccheneson
Nein, es ist ein einfaches Layout. Ich denke, ich werde meine Elemente nur programmgesteuert hinzufügen - ohne XML. Danke für die Hilfe!
Michal Dymel
27

Obwohl späte Antwort, möchte aber diesen einen Weg hinzufügen, um dies zu bekommen

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

Wo itemist das übergeordnete Layout, in dem Sie ein untergeordnetes Layout hinzufügen möchten?

Shaista Naaz
quelle
(noch später) Ich habe Schwierigkeiten, Ihre Antwort umzusetzen. Ich habe den oben erwähnten Code ausprobiert, aber 'item' durch 'R.layout.activity_layout' ersetzt. Ich erhalte die Meldung "Es gibt keine anwendbare Methode für '(int, int)'". Könnte ich Sie wegen Ihrer Gedanken belästigen?
Kyle
1
@ Kyle - noch später noch. Sie können RRessourcen nicht als Verweise auf ein Objekt verwenden, sie sind nur ints. Sie müssen findViewByIddie RRessource übergeben und dann cast an das gewünschte Objekt eingeben. Dann können Sie es in Funktionsaufrufen wie verwenden inflate. (dh ViewGroup item = (ViewGroup) findViewById(R.layout.activity_layout);... dann können Sie itemwie oben verwenden.)
Pimp Trizkit
Ich denke, ich möchte in meinem obigen Beispiel RelativeLayoutanstelle von ViewGroupdort verwenden, da Sie die Basisklasse nicht instanziieren können ViewGroup. 5-Minuten-Bearbeitungsregel hat mich erwischt. lol
Pimp Trizkit
Ist es möglich, Eltern zu verbergen und nur Kinderansicht anzuzeigen
NovusMobile
Vielen Dank, diese Methode hat geholfen, wo ich getContext () im vorherigen Beispiel nicht verwenden konnte, da ich Fragmente verwende.
RightHandedMonkey
19

Es ist hilfreich, dies hinzuzufügen, obwohl es sich um einen alten Beitrag handelt: Wenn die untergeordnete Ansicht, die aus XML aufgeblasen wird, einem Ansichtsgruppenlayout hinzugefügt werden soll, müssen Sie "Aufblasen" mit einem Hinweis darauf aufrufen, um welche Art von Ansichtsgruppe es sich handelt hinzugefügt werden. Mögen:

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

Die Aufblasmethode ist ziemlich überlastet und beschreibt diesen Teil der Verwendung in den Dokumenten. Ich hatte ein Problem, bei dem eine einzelne aus XML aufgeblasene Ansicht im übergeordneten Element nicht richtig ausgerichtet wurde, bis ich diese Art von Änderung vorgenommen habe.

Maximus
quelle
Zum Schluss danke :) Dies ermöglicht das Hinzufügen mehrerer Ansichten zu einem übergeordneten Element, ohne dass Sie sich um die LayoutParams kümmern müssen, die aus dem XML-Code gelesen werden. Gut gemacht!
Sabo
13

Noch einfacher ist die Verwendung

View child = View.inflate(context, R.layout.child, null)
item.addChild(child) //attach to your item
Ashish Rawat
quelle
Verwenden View.inflate()ist der beste Weg, nicht unnötig LayoutInflateroder getSystemService(Context.LAYOUT_INFLATER_SERVICE)oder irgendetwas von all dem Ärgernis! : D
Varun
8

Layout Inflation

View view = null;
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
view = inflater.inflate(R.layout.mylayout, null);
main.addView(view);
Glücklicher Singh
quelle
6

Wenn Sie nicht in einer Aktivität sind, können Sie die statische from()Methode aus der LayoutInflaterKlasse verwenden, um eine zu erhalten LayoutInflater, oder den Dienst auch über die Kontextmethode anfordern 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);

(Ich weiß, es ist fast 4 Jahre her, aber immer noch erwähnenswert)

Juan Cortés
quelle
4

Wenn Sie eine einzelne Ansicht mehrmals hinzufügen möchten, müssen Sie verwenden

   layoutInflaterForButton = getActivity().getLayoutInflater();

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

Wenn du magst

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

und

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

dann wird eine Ausnahme aller fertig hinzugefügten Ansichten ausgelöst.

John Smith
quelle
4

AttachToRoot Auf True setzen

Stellen Sie sich vor, wir haben eine Schaltfläche in einer XML-Layoutdatei angegeben, deren Layoutbreite und Layouthöhe auf match_parent festgelegt sind.

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

Klicken Sie auf diese Schaltflächen auf Ereignis. Wir können den folgenden Code festlegen, um das Layout für diese Aktivität zu erhöhen.

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

Hoffe, diese Lösung funktioniert für Sie.!

eSparkBiz-Team
quelle
3

Versuchen Sie diesen Code:

  1. Wenn Sie nur Ihr Layout aufblasen möchten:

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. Wenn Sie Ihr Layout im Container aufblasen möchten (übergeordnetes Layout):

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
quelle
2

Ich hatte es aufgrund meiner besonderen Umstände am schwersten mit diesem Fehler, fand aber schließlich eine Lösung.

Meine Situation: Ich verwende eine separate Ansicht (XML), die a enthält WebViewund dann in einer geöffnet wird, AlertDialogwenn ich in meiner Hauptaktivitätsansicht auf eine Schaltfläche klicke. Aber irgendwie WebViewgehörte die zur Hauptaktivitätsansicht (wahrscheinlich, weil ich die Ressource von hier abrufe), also musste ich kurz bevor ich sie meiner AlertDialog(als Ansicht) zuordnete , die Eltern von mir holen WebView, sie in eine ViewGroup, Entfernen Sie dann alle Ansichten dazu ViewGroup. Dies funktionierte und mein Fehler ging weg.

// 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...

.... später nachdem ich meine 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
quelle
2

Wenn Sie versuchen, eine untergeordnete Ansicht an das RelativeLayout anzuhängen? Sie können tun, indem Sie folgen

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

Mit Kotlin können Sie Folgendes verwenden:

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

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

Ich hatte unten einen Codeausschnitt dafür verwendet und es funktionierte für mich.

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