2017-10-27 2 views
0

Ich habe das folgende Layout mit dem Namen sample_layout.xml und ich möchte verwenden Sie es mehrmals, aber jedes Mal mit ein paar Änderungen.Gibt es eine andere Möglichkeit, dasselbe Layout mit anderen Attributen in Android Studio mehrmals zu verwenden, außer DataBinding?

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:layout_marginBottom="20dp"> 

    <RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="110dp" 
    android:background="@drawable/full_panel_blue" 
    android:padding="10dp" 
    android:layout_marginBottom="20dp"> 

    <ImageView 
     android:layout_width="120dp" 
     android:layout_height="120dp" 
     android:src="@mipmap/first_icon" /> 

    <LinearLayout 
     android:layout_width="350dp" 
     android:layout_height="fill_parent" 
     android:layout_alignParentRight="true" 
     android:gravity="end" 
     android:orientation="vertical"> 

     <TextView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:textColor="@color/my_white" 
      android:text="4000000" 
      android:textSize="50sp" 
      android:gravity="end"/> 

     <TextView 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:gravity="end" 
      android:textColor="@color/my_white" 
      android:textSize="20sp" 
      android:text="Sample text" /> 

    </LinearLayout> 

    </RelativeLayout> 

</LinearLayout> 

Lower ist das Layout, wo es mehrere Male

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical"> 

    <include layout="@layout/sample_layout"/> 
    <include layout="@layout/sample_layout"/> 
    <include layout="@layout/sample_layout"/> 

</LinearLayout> 

So enthalten sein wird, möchte ich es erstmals schließen, wie es ist, aber die zweite Zeit anstelle der @drawable/full_blue_panel, möchte ich eine andere ziehbare (@drawable/red_w_transparency) verwenden. Und auch für die ImageView Ich möchte ein anderes src für das Symbol zum zweiten Mal verwenden, und ein anderes zum dritten Mal. Vielleicht verschiedene Texte in der TextView jedes Mal und so weiter für eines der zuvor erstellten Attribute. Ich habe bereits versucht, etwas mit DataBinding , aber ich glaube nicht, dass es genau dafür geeignet ist. Gibt es einen anderen Weg dazu?

Antwort

1

Im Allgemeinen löse ich diese Art von Problem, indem ich eine benutzerdefinierte View Unterklasse erstellen. Die Grundlagen werden hier behandelt:

Die kurze Version ist, dass Sie einige benutzerdefinierte Attribute definieren, die die Teile beeinflussen, die Sie ändern möchten, und erstellen Sie dann eine View Unterklassenimplementierung, die diese Attribute liest, um seine Ansichtshierarchie zu ändern.

In Ihrem informierten Beispiel: Sie haben diese relevanten Punkte:

  • Die Wurzel ist ein LinearLayout
  • Sie wollen
  • den RelativeLayout Hintergrund ändern
  • Sie mögen die ImageView src
  • Sie ändern möchte die TextView Text
ändernSie könnten diese Attribute in Ihrem attrs.xml erstellen:

<declare-styleable name="MyCompoundComponent"> 
    <attr name="background"/> 
    <attr name="imageSrc"/> 
    <attr name="primaryText"/> 
</declare-styleable> 

Als nächst Sie die Ansicht Klasse erstellen. Da Ihre Wurzel des Original-Layout LinearLayout war, werden wir davon ableiten:

public class MyCompoundComponent extends LinearLayout { 

    public MyCompoundComponent(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyCompoundComponent); 
     // read your attributes 
     a.recycle(); 

     inflate(context, R.layout.my_compound_component, this); 

     // find your views, use your attributes to modify them 
    } 
} 

Und natürlich müssen Sie ein Layout. Sie können einfach den oben angegebenen verwenden, außer dass Sie das Root-Element in <merge> ändern würden, jetzt, wo Sie es in einem LinearLayout aufblasen.

Damit alles an seinem Platz, können Sie diese Ansicht in der anderen Layouts verwenden wie jede andere Ansicht:

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical"> 

    <com.example.stackoverflow.MyCompoundComponent 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:background="@color/blue" 
     app:imageSrc="@drawable/image1" 
     app:primaryText="@string/text1"/> 

    <com.example.stackoverflow.MyCompoundComponent 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:background="@color/red" 
     app:imageSrc="@drawable/image2" 
     app:primaryText="@string/text2"/> 

</LinearLayout> 
+0

ok, ich habe alles getan, aber immer noch nicht, den ich sehe, wie es würde wissen, was ' imageSrc' wird im benutzerdefinierten Layout geändert, da es zwei 'ImageView' gibt, oder wie weiß es, welcher Text geändert werden muss, da es mehr in der benutzerdefinierten Ansicht gibt (und verschachtelt sind). –

+0

Erstellen Sie mehrere Attribute. Sie können einen beliebigen Namen verwenden, zB '' und '' oder '' vs '< attr name = "foreground" /> 'usw. Dann können Sie diese im Code abrufen und sie den richtigen Ansichten zuordnen. –

Verwandte Themen