Próbuję utworzyć niestandardowy widok, który zastąpiłby pewien układ, którego używam w wielu miejscach, ale z trudem to robię.
Zasadniczo chcę to zastąpić:
<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>
Przez to:
<view class="com.example.MyQuantityBox"
android:id="@+id/dolphinBox"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:myCustomAttribute="@string/my_title"/>
Więc nie chcę niestandardowego układu, chcę niestandardowego widoku (nie powinno być możliwe, aby ten widok miał dziecko).
Jedyną rzeczą, która może się zmienić z jednej instancji MyQuantityBox na inną, jest tytuł. Bardzo chciałbym móc to określić w XML (tak jak w ostatniej linii XML)
W jaki sposób mogę to zrobić? Czy powinienem umieścić RelativeLayout w pliku XML w / res / layout i zawyżać go w mojej klasie MyBoxQuantity? Jeśli tak, jak mam to zrobić?
Dzięki!
Odpowiedzi:
Tak, możesz to zrobić. RelativeLayout, LinearLayout itp. Są widokami, więc układ niestandardowy jest widokiem niestandardowym. Po prostu coś do rozważenia, ponieważ jeśli chcesz stworzyć niestandardowy układ, możesz.
To, co chcesz zrobić, to utworzyć kontrolę złożoną. Utworzysz podklasę RelativeLayout, dodasz wszystkie nasze komponenty w kodzie (TextView itp.), Aw konstruktorze możesz odczytać atrybuty przekazane z XML. Następnie możesz przekazać ten atrybut do swojego tytułu TextView.
http://developer.android.com/guide/topics/ui/custom-components.html
źródło
Trochę stary, ale pomyślałem, że podzielę się tym, jak to zrobię, na podstawie odpowiedzi chubbsondubs: używam
FrameLayout
(patrz Dokumentacja ), ponieważ jest używany do przechowywania pojedynczego widoku i nadmuchuję do niego widok z xml.Kod następujący:
źródło
this
, trzeci parametr)Oto proste demo do tworzenia widoku niestandardowego (widoku złożonego) przez zawyżanie z XML
attrs.xml
CustomView.kt
custom_layout.xml
My powinniśmy używać
merge
tutaj zamiastConstraintLayout
ponieważJeśli użyjemy
ConstraintLayout
tutaj, hierarchia układu będzieConstraintLayout
->ConstraintLayout
->ImageView
+TextView
=> mamy 1 nadmiarowyConstraintLayout
=> niezbyt dobry pod względem wydajnościKorzystanie z activity_main.xml
Wynik
Demo Github
źródło
Użyj LayoutInflater, jak pokazano poniżej.
źródło
W praktyce odkryłem, że musisz być trochę ostrożny, zwłaszcza jeśli wielokrotnie używasz fragmentu XML. Załóżmy na przykład, że masz tabelę, w której chcesz utworzyć wiersz tabeli dla każdego wpisu na liście. Skonfigurowałeś XML:
W
my_table_row.xml
:Następnie chcesz utworzyć go raz w wierszu za pomocą kodu. Zakłada się, że zdefiniowałeś element nadrzędny TableLayout myTable, do którego chcesz dołączyć Rows.
Aby zapoznać się z jasnym, prostym przykładem obsługi rowButton.setOnClickListener (this), zobacz Onclicklistener dla programowo utworzonego przycisku .
źródło