Wie eine Ansicht mit einem Layout aufzublasen
-
22-09-2019 - |
Frage
ich ein Layout in XML definiert haben. 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 anderen XML-Layout-Datei aufzublasen. Ich kann verschiedene Layouts verwenden, um auf eine Situation abhängig. Wie soll ich es tun? Ich habe versucht, verschiedene Variationen von
RelativeLayout item = (RelativeLayout) findViewById(R.id.item);
item.inflate(...)
Aber keiner von ihnen hat gut funktioniert.
Lösung
Ich bin nicht sicher, ich habe Ihre Frage- gefolgt versuchen Sie, ein Kind Blick auf die RelativeLayout zu befestigen? Wenn dies der Fall möchten Sie etwas entlang der Linien von dem tun:
RelativeLayout item = (RelativeLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, null);
item.addView(child);
Andere Tipps
Sie eine XML-Ressource aufzublasen. Sehen Sie sich die LayoutInflater doc .
Wenn Ihr Layout ist in einem mylayout.xml , würden Sie so etwas wie:
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);
Obwohl spät Antwort, aber möchte, dass ein Weg, um hinzufügen, um dieses
zu bekommenLayoutInflater layoutInflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = layoutInflater.inflate(R.layout.mylayout, item );
wo item
ist die Mutter Layout, in dem Sie ein Kind Layout hinzufügen möchten.
Es ist hilfreich, um dies zu schreiben, auch wenn es eine alte Post, dass, wenn das Kind Ansicht, die von xml aufgeblasen wird, ist zu einem Viewgroup Layout hinzugefügt werden, müssen Sie Anruf aufblasen mit einer Ahnung von dem, was Art von Viewgroup es wird hinzugefügt werden. Wie:
View child = getLayoutInflater().inflate(R.layout.child, item, false);
Die aufblasen Methode ist ziemlich überlastet und beschreibt diesen Teil der Nutzung in der Dokumentation. Ich hatte ein Problem, bei dem eine einzelne Ansicht von xml aufgeblasen wurde nicht richtig in den übergeordneten Ausrichtung, bis ich diese Art von Änderung vorgenommen habe.
Noch einfache Art und Weise verwenden
View child = View.inflate(context, R.layout.child, null)
item.addChild(child) //attach to your item
Layout Inflation
View view = null;
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.mylayout, null);
main.addView(view);
Wenn Sie nicht in einer Tätigkeit sind Sie die statische from()
Methode aus der LayoutInflater
-Klasse verwenden, können eine LayoutInflater
zu bekommen, oder fordern Sie den Service aus dem Kontext Methode getSystemService()
auch:
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ß, dass es fast 4 Jahre her, aber immer noch Erwähnenswert)
Wenn Sie eine einzelne Ansicht mehr Zeit hinzufügen, dann haben Sie zu 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 Sie das tun, wie
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 es Ausnahme alle bereit hinzugefügt Ansicht werfen.
AttachToRoot Set auf True
Man denke nur wir eine Schaltfläche in einer XML-Layout-Datei mit Layoutbreite und das Layout Höhe Satz match_parent angegeben.
<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>
Auf dieser Buttons Ereignis klicken wir auf dieser Aktivität folgenden Code aufzublasen-Layout festlegen.
LayoutInflater inflater = LayoutInflater.from(getContext());
inflater.inflate(R.layout.yourlayoutname, this);
Hope diese Lösung funktioniert für Sie.
Ich hatte die härteste Zeit mit diesem Fehler, wegen meiner einzigartigen Umstände, aber endlich eine Lösung gefunden.
Meine Situation: Ich verwende eine separate Ansicht (XML), die eine WebView
hält, öffnet sich dann in einem AlertDialog
wenn ich eine Taste in meiner Haupttätigkeit Ansicht klicken. Aber irgendwie oder andere die WebView
zur Haupttätigkeit Ansicht gehörte (wahrscheinlich, weil ich die Ressource von hier ziehen), so kurz bevor ich es meinem AlertDialog
(als Ansicht) zugeordnet ist, hatte ich die Eltern meiner WebView
zu erhalten, setzen Sie es in eine ViewGroup
, dann entfernen Sie alle Ansichten auf diesem ViewGroup
. Das 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 lud 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();
Wenn Sie Sie versuchen, ein Kind Blick auf die RelativeLayout zu befestigen? Sie können durch folgende
tunRelativeLayout item = (RelativeLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, item, true);
Versuchen Sie diesen Code ein:
- Wenn Sie wollen einfach nur Ihr Layout aufzublasen:
View view = LayoutInflater.from(context).inflate(R.layout.your_xml_layout,null); // Code for inflating xml layout
RelativeLayout item = view.findViewById(R.id.item);
- Wenn Sie Ihr Layout in Container (Eltern-Layout) aufzublasen:
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.
Mit Kotlin, können Sie:
val content = LayoutInflater.from(context).inflate(R.layout.[custom_layout_name], null)
[your_main_layout].apply {
//..
addView(content)
}
ich unter Code-Snippet für diese benutzt hatte, und es funktioniert für mich.
LinearLayout linearLayout = (LinearLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, null);
linearLayout.addView(child);
brauchen keine jede mögliche Komplexität es nur einfach wie
setContentView(R.layout.your_layout);