Erstellen Sie eine benutzerdefinierte Ansicht, indem Sie ein Layout aufblasen?

Lesezeit: 5 Minuten

Ich versuche, eine benutzerdefinierte Ansicht zu erstellen, die ein bestimmtes Layout ersetzen würde, das ich an mehreren Stellen verwende, aber ich habe Schwierigkeiten damit.

Im Grunde möchte ich dies ersetzen:

<RelativeLayout
 android:id="@+id/dolphinLine"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
    android:layout_centerInParent="true"
 android:background="@drawable/background_box_light_blue"
 android:padding="10dip"
 android:layout_margin="10dip">
  <TextView
   android:id="@+id/dolphinTitle"
   android:layout_width="200dip"
   android:layout_height="100dip"
   android:layout_alignParentLeft="true"
   android:layout_marginLeft="10dip"
   android:text="@string/my_title"
   android:textSize="30dip"
   android:textStyle="bold"
   android:textColor="#2E4C71"
   android:gravity="center"/>
  <Button
   android:id="@+id/dolphinMinusButton"
   android:layout_width="100dip"
   android:layout_height="100dip"
   android:layout_toRightOf="@+id/dolphinTitle"
   android:layout_marginLeft="30dip"
   android:text="@string/minus_button"
   android:textSize="70dip"
   android:textStyle="bold"
   android:gravity="center"
   android:layout_marginTop="1dip"
   android:background="@drawable/button_blue_square_selector"
   android:textColor="#FFFFFF"
   android:onClick="onClick"/>
  <TextView
   android:id="@+id/dolphinValue"
   android:layout_width="100dip"
   android:layout_height="100dip"
   android:layout_marginLeft="15dip"
   android:background="@android:drawable/editbox_background"
   android:layout_toRightOf="@+id/dolphinMinusButton"
   android:text="0"
   android:textColor="#2E4C71"
   android:textSize="50dip"
   android:gravity="center"
   android:textStyle="bold"
   android:inputType="none"/>
  <Button
   android:id="@+id/dolphinPlusButton"
   android:layout_width="100dip"
   android:layout_height="100dip"
   android:layout_toRightOf="@+id/dolphinValue"
   android:layout_marginLeft="15dip"
   android:text="@string/plus_button"
   android:textSize="70dip"
   android:textStyle="bold"
   android:gravity="center"
   android:layout_marginTop="1dip"
   android:background="@drawable/button_blue_square_selector"
   android:textColor="#FFFFFF"
   android:onClick="onClick"/>
</RelativeLayout>

Dadurch:

<view class="com.example.MyQuantityBox"
    android:id="@+id/dolphinBox"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:myCustomAttribute="@string/my_title"/>

Ich möchte also kein benutzerdefiniertes Layout, ich möchte eine benutzerdefinierte Ansicht (es sollte nicht möglich sein, dass diese Ansicht ein untergeordnetes Element hat).

Das einzige, was sich von einer Instanz einer MyQuantityBox zur anderen ändern könnte, ist der Titel. Ich würde dies sehr gerne im XML angeben können (wie ich es in der letzten XML-Zeile tue)

Wie kann ich das machen? Soll ich das RelativeLayout in eine XML-Datei in /res/layout einfügen und es in meiner MyBoxQuantity-Klasse aufblasen? Wenn ja, wie mache ich das?

Vielen Dank!

  • Siehe „Compound Controls“ in Android und diesen Link: stackoverflow.com/questions/1476371/…

    – greg7gkb

    9. August 2012 um 20:26 Uhr

Benutzer-Avatar
Fuchs

Ein bisschen alt, aber ich dachte, ich würde teilen, wie ich es machen würde, basierend auf der Antwort von Chubbsondubs: Ich benutze FrameLayout (sehen Dokumentation), da es verwendet wird, um eine einzelne Ansicht zu enthalten, und füllen Sie die Ansicht aus der XML-Datei darin auf.

Folgender Code:

public class MyView extends FrameLayout {
    public MyView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        initView();
    }

    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView();
    }

    public MyView(Context context) {
        super(context);
        initView();
    }

    private void initView() {
        inflate(getContext(), R.layout.my_view_layout, this);
    }
}

  • Da die View-Klasse über die statische Methode inflate() verfügt, ist LayoutInflater.from() nicht erforderlich.

    – abgelegen

    22. Juli 2013 um 14:22 Uhr

  • Ist das nicht nur die Lösung von Johannes von hier: stackoverflow.com/questions/17836695/… Trotzdem bläst dies ein anderes Layout auf. Also ist es nicht wirklich die beste Lösung, würde ich vermuten.

    – Tobias Reich

    18. Oktober 2014 um 14:59 Uhr

  • es ist, aber Johannes Lösung ist von 7.24.13, und Geist war von 7.1.13 … Außerdem verwendet meine Lösung FrameLayout, das nur eine Ansicht enthalten soll (wie in dem Dokument geschrieben, auf das in der Lösung verwiesen wird). Eigentlich soll es also als Platzhalter für eine View dienen. Ich kenne keine Lösung, die nicht die Verwendung eines Platzhalters für die aufgeblasene Ansicht erfordert.

    – Fuchs

    18. Oktober 2014 um 15:43 Uhr


  • Ich verstehe es nicht. Diese Methode (inflate) gibt eine Ansicht zurück, die ignoriert wird. Anscheinend müssen Sie es der aktuellen Ansicht hinzufügen.

    – Jeffrey Blattmann

    16. Juni 2020 um 17:56 Uhr

  • @Jeffrey Blattman bitte überprüfen Sie heraus Ansehen.aufblasen Methode verwenden wir diese (mit Angabe der Wurzel als this3. Parameter)

    – V1raNi

    30. Juli 2020 um 21:17 Uhr


  • Hallo Neil, ich habe das gleiche versucht. es funktioniert gut. aber wenn ich auf rowButton klicke, ruft es Webservices auf und nachdem ich eine Antwort vom Server erhalten habe, möchte ich einen Text in einer bestimmten Position rowText..any help pls aktualisieren?

    – Harikrishnan

    10. Februar 2018 um 10:00 Uhr

  • siehe auch meine frage. stackoverflow.com/questions/48719970/…

    – Harikrishnan

    10. Februar 2018 um 10:58 Uhr

Benutzer-Avatar
Tsunaz

Verwenden Sie den LayoutInflater wie unten gezeigt.

public View myView() {
    View v; // Creating an instance for View Object
    LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    v = inflater.inflate(R.layout.myview, null);

    TextView text1 = v.findViewById(R.id.dolphinTitle);
    Button btn1 = v.findViewById(R.id.dolphinMinusButton);
    TextView text2 = v.findViewById(R.id.dolphinValue);
    Button btn2 = v.findViewById(R.id.dolphinPlusButton);

    return v;
}

  • Ich habe dasselbe versucht. es funktioniert gut. aber wenn ich auf btn1 klicke, ruft es Webservices auf und nachdem ich eine Antwort vom Server erhalten habe, möchte ich einen Text in bestimmter Position text2 aktualisieren.

    – Harikrishnan

    10. Februar 2018 um 10:12 Uhr

Benutzer-Avatar
Chubbsondubs

Ja, das können Sie tun. RelativeLayout, LinearLayout usw. sind Ansichten, sodass ein benutzerdefiniertes Layout eine benutzerdefinierte Ansicht ist. Nur etwas zu beachten, denn wenn Sie ein benutzerdefiniertes Layout erstellen möchten, können Sie dies tun.

Was Sie tun möchten, ist ein zusammengesetztes Steuerelement zu erstellen. Sie erstellen eine Unterklasse von RelativeLayout, fügen alle Ihre Komponenten im Code hinzu (TextView usw.) und in Ihrem Konstruktor können Sie die aus dem XML übergebenen Attribute lesen. Sie können dieses Attribut dann an Ihre Titel-TextView übergeben.

http://developer.android.com/guide/topics/ui/custom-components.html

  • Ich habe dasselbe versucht. es funktioniert gut. aber wenn ich auf btn1 klicke, ruft es Webservices auf und nachdem ich eine Antwort vom Server erhalten habe, möchte ich einen Text in bestimmter Position text2 aktualisieren.

    – Harikrishnan

    10. Februar 2018 um 10:12 Uhr

Benutzer-Avatar
WerWet

Eine einfache benutzerdefinierte Ansicht mit Kotlin

Ersetzen Sie FrameLayout durch die Ansicht, die Sie erweitern möchten

/**
 * Simple Custom view
 */
class [email protected]
constructor(context: Context,
            attrs: AttributeSet? = null,
            defStyleAttr: Int = 0)
    : FrameLayout(context, attrs, defStyleAttr) {

    init {
        // Init View
        val rootView = (getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater)
                .inflate(R.layout.custom_layout, this, true)
        val titleView= rootView.findViewById(id.txtTitle)

        // Load Values from XML
        val attrsArray = getContext().obtainStyledAttributes(attrs, R.styleable.CutsomView, defStyleAttr, 0)
        val titleString = attrsArray.getString(R.styleable.cutomAttrsText)
        attrsArray.recycle()
    }
}

  • Was ist R.styleable.CutsomView und R.styleable.cutomAttrsText?

    – Andreas Bechtold

    5. Mai 2021 um 10:12 Uhr

1010610cookie-checkErstellen Sie eine benutzerdefinierte Ansicht, indem Sie ein Layout aufblasen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy