So erstellen Sie wiederverwendbare xml-Wrapper für Android Layout-Dateien

Ich habe mehrere Layout-Dateien, die meistens die gleichen sind, außer für einen Abschnitt. Gibt es eine Möglichkeit, dass ich die gemeinsame XML alle an einem Ort haben kann; Statt Kopie / Einfügen, und mit einer Menge von Dateien zu aktualisieren, wenn ich 1 ändern wollen?

Ich weiß, dass ich XML aus anderen XML-Dateien enthalten kann, aber der gemeinsame Code ist kein internes Steuerelement. Es ist die äußere Umhüllung; So auch nicht funktioniert. Grundsätzlich habe ich ein paar Dateien, die alle so aussehen:

  • MVP Android - Wie viele Moderatoren?
  • AndroidRuntime-Fehler: Paket: nicht in der Lage, den Wert zu marschieren
  • Implementierung 47degree android-swipelistview zum swiping android ListViewItem
  • Gradle-Synchronisierung fehlgeschlagen: Version: 8.4.0 ist niedriger als die minimale Version (9.0.0), die für das Google-Services-Plugin erforderlich ist
  • So stellen Sie die ImageButton-Eigenschaft von app: srcCompat = "@ drawable / pic" programmgesteuert ein?
  • SimpleCursorAdapter und CursorAdapter
  • <LinearLayout android:id="@+id/row" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal"> <ImageView android:layout_height="26dp" android:id="@+id/checkImage" android:layout_width="26dp" android:layout_alignParentTop="true" android:scaleType="fitCenter"/> <!-- Different types of views go here depending on which layout file it is --> <ImageButton android:layout_height="fill_parent" android:id="@+id/playButton" android:layout_width="42dp" android:src="@drawable/play_button" android:scaleType="center" android:background="#00000000"/> </LinearLayout> 

    Grundsätzlich möchte ich was tun, was ASP.Net mit Master Pages macht. Gibt es eine Option dafür?

  • Android Emulator nicht auf netbeans geladen
  • GCM onRegistered nicht aufgerufen
  • Android scrollen zum Ende einer Listenansicht
  • Android 2.2 Webview verursacht OpenGL ES API ohne aktuellen Kontext (einmal pro Thread protokolliert)
  • Wann soll ich einen hilfsbasierten Dienst nutzen?
  • Aufruf der getIntent-Methode im Dienst
  • 4 Solutions collect form web for “So erstellen Sie wiederverwendbare xml-Wrapper für Android Layout-Dateien”

    Die Lösung war ziemlich einfach.

    Sie müssen die " Activity " onCreate() in onCreate() -Funktion SetContentView auf Ihr Basis-XML-Layout erweitern und auch setContentView in base Activity Class überschreiben

    Beispielsweise:

    1.Schneiden Sie base_layout.xml mit dem untenstehenden Code

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <ImageView android:id="@+id/image_view_01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:maxHeight="50dp" /> </LinearLayout> <LinearLayout android:id="@+id/base_layout" android:layout_width="match_parent" android:layout_height="match_parent" > </LinearLayout> </LinearLayout> 
    1. Erstellen Sie BaseActivity.java
     public class BaseActivity extends Activity { ImageView image; LinearLayout baseLayout; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.base_layout); this.image = (ImageView) this.findViewById(R.id.image_view_01); this.baseLayout = (LinearLayout) this.findViewById(R.id.base_layout); this.image.setImageResource(R.drawable.header); } @Override public void setContentView(int id) { LayoutInflater inflater = (LayoutInflater)getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(id, this.baseLayout); } } 

    Und SomeActivity.java

     public class SomeActivity extends BaseActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.some_layout); //rest of code } } 

    Das einzige, was ich bisher bemerkt habe, war, dass beim Anfordern einer Fortschrittsleiste (requestWindowFeature (Window.FEATURE_INDETERMINATE_PROGRESS)) dies vor dem Aufruf von super.onCreate durchgeführt werden muss. Ich denke, das ist, weil noch nichts gezeichnet werden kann, bevor er diese Funktion aufruft.

    Das hat mir gut geklappt und hoffentlich findest du das in deiner eigenen Codierung nützlich.

    Vielleicht könntest du eine Haupt-Layout-XML-Datei verwenden und dann andere Widgets dynamisch per Code hinzufügen oder entfernen.

    Ich habe versucht, genau das zu tun – ich wollte eine Ansicht, die einen Knopf auf der linken Seite und einen Knopf auf der rechten Seite hatte, konnte aber beliebigen Inhalt in der Mitte haben (je nachdem, wer es war). Grundsätzlich eine benutzerdefinierte Ansichtsgruppe, die im XML-Layout eine untergeordnete Ansicht haben könnte und diese untergeordneten Ansichten mit einem anderen XML-Layout umschließen würde. Hier ist, wie ich es gemacht habe:

    Top_bar.xml: Dies stellt das gemeinsame Layout dar, um Sachen mit zu verpacken. Beachten Sie die LinearLayout (könnte jedes Layout) mit einer ID "addChildrenHere" – es wird später referenziert.

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/topBarLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="left" /> <LinearLayout android:id="@+id/addChildrenHere" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1"/> <Button android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="right" /> </LinearLayout> 

    Main.xml: Das Hauptlayout. Dies beinhaltet eine benutzerdefinierte Viewgroup (WrappedLayout) mit wenigen Kindern. Beachten Sie, wie es einen benutzerdefinierten XML-Namespace deklariert und setzt zwei benutzerdefinierte Attribute auf das WrappedLayout-Tag (diese sagen, welches Layout, um die Kinder zu wickeln, und wo innerhalb dieses Layouts die Kinder dieses Knotens platziert werden sollen).

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:karl="http://schemas.android.com/apk/res/karl.test" android:id="@+id/linearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <karl.test.WrappedLayout android:id="@+id/topBarLayout1" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" karl:layoutToInflate="@layout/top_bar" karl:childContainerID="@+id/addChildrenHere"> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="This is a child of the special wrapper." android:textAppearance="?android:attr/textAppearanceMedium" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="This is another child; you can put anything here." android:textAppearance="?android:attr/textAppearanceMedium" /> </karl.test.WrappedLayout> </LinearLayout> 

    Attrs.xml: Das geht in res / Werte. Dies definiert die benutzerdefinierten XML-Attribute, die im obigen XML verwendet werden.

     <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="WrappedLayout"> <attr name="layoutToInflate" format="integer"/> <attr name="childContainerID" format="integer"/> </declare-styleable> </resources> 

    Schließlich WrappedLayout.java: Dies behandelt das Lesen der benutzerdefinierten Attribute, und ein bisschen hackery zu machen addView () tatsächlich fügen Sie die Ansichten an einem anderen Ort.

     package karl.test; import android.content.Context; import android.content.res.TypedArray; import android.util.AttributeSet; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; public class WrappedLayout extends FrameLayout { ///Attempts to add children to this layout will actually get forwarded through to mChildContainer. ///This would be final, but it's actually used indirectly by the constructor before it's initialised. private ViewGroup mChildContainer; public WrappedLayout(Context context, AttributeSet attrs) { super(context, attrs); //read the custom attributes final int layoutToInflate; final int childContainerID; { final TypedArray styledAttributes = context.obtainStyledAttributes(attrs, R.styleable.WrappedLayout); layoutToInflate = styledAttributes.getResourceId(R.styleable.WrappedLayout_layoutToInflate, 0); childContainerID = styledAttributes.getResourceId(R.styleable.WrappedLayout_childContainerID, 0); styledAttributes.recycle(); } if(layoutToInflate == 0 || childContainerID == 0) { Log.e("Error", "WrappedLayout.WrappedLayout(): Error reading custom attributes from XML. layoutToInflate = " + layoutToInflate + ", childContainerID =" + childContainerID); } else { //inflate the layout and (implicitly) add it as a child view final View inflatedLayout = View.inflate(context, layoutToInflate, this); //grab the reference to the container to pass children through to mChildContainer = (ViewGroup)inflatedLayout.findViewById(childContainerID); } } ///All the addView() overloads eventually call this method. @Override public void addView(View child, int index, ViewGroup.LayoutParams params) { if(mChildContainer == null) { //still inflating - we're adding one of the views that makes up the wrapper structure super.addView(child, index, params); } else { //finished inflating - forward the view through to the child container mChildContainer.addView(child, index, params); } } } 

    Das funktioniert, soweit ich sagen kann. Es funktioniert nicht sehr gut mit dem Eclipse Layout Editor (ich bin nicht ganz sicher, was das Problem ist), aber man kann das Layout gut sehen. Das Ändern der Kinder des WrappedLayouts erfordert das manuelle Editieren des XML.

    Hast du bei der Anwendung von Styles und Themes gesucht?

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.