Edit a View (TextView / ImageView) inside a layout used in <include> tag using custom attribute

Я новичок в разработке Android.
Is it possible to change a View inside an included layout using custom attribute?

Я имею в виду, как это:

Это my_layout XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/listItem"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

<ImageView
    android:id="@+id/userImage"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:src="..." />
    <!-- this src attribute can be overrided using my own attribute in the iclude tage -->

<TextView
    android:id="@+id/userName"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="..." />
    <!-- this text attribute can be overrided using my own attribute in the iclude tage -->
</LinearLayout>

and this is how I want to include my_layout to the activity layout:

<include layout="@layout/my_layout" userName="@string/userName1" userImage="@drawable/userImage1"/>

userName а также userImage override the value of android:text а также android:src приписывать.

I have read about Data Binding but what I mean here is not using any Java class. I just need to define a variable into data tag in my_layout с type value referenced to @string/ или же @drawable/ to get a text or picture.

Является ли это возможным?

2 ответа

Решение

Как ваше описание, вы хотите опубликовать userName1 а также userImage1 Посмотреть в my_layout, Вы не можете сделать это. И то, как вы используете пользовательский вид, неверно. Тег 'include' также не является пользовательским тегом.

Вы можете использовать пользовательский атрибут, следуя этому примеру:

<com.amscf.view.InviteItemView
    android:id="@+id/invite_item_instagram"
    android:layout_width="match_parent"
    android:layout_height="80dp"
    android:background="@drawable/item_color"
    android:paddingBottom="10dp"
    android:paddingTop="10dp"
    app:appicon="@drawable/icon_app_instagram"
    app:btntext=""
    app:coindesc="Post a invitation"
    app:cointext="Share to Instagram"
    app:showweek="false"/>

В представлении InviteItemView вы можете получить attibute appIcon, btnText с кодом ниже:

TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.invite_item_view);
int refId = typedArray.getResourceId(R.styleable.invite_item_view_appicon, R.mipmap.ic_launcher);
String btnText = typedArray.getString(R.styleable.invite_item_view_btntext);

refId а также btnText это то, что вы получите.

Добавьте приведенный ниже код к вашему attrs.xmlэто определение invite_item_view

<declare-styleable name="invite_item_view">
    <attr name="appicon" format="reference"/>
    <attr name="cointext" format="string"/>
    <attr name="coindesc" format="string"/>
    <attr name="btntext" format="string"/>
    <attr name="showweek" format="boolean"/>
</declare-styleable>

<inlcude /> тег поможет вам повторно использовать макет, который отличается на разных страницах. Одним из примеров является определение пользовательской панели инструментов и ее повторное использование в действиях, фрагмент.

В настоящее время вы можете добавить этот пользовательский тег, как вы упомянули, но вместо этого вы можете сразу объявить в коде, просто без DataBinding:

Например, с этим toolbar.xml:

<android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:layout_scrollFlags="scroll|enterAlways"
        app:popupTheme="@style/AppTheme.PopupOverlay">

        <TextView
            android:id="@+id/toolbar_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:textColor="@color/colorWhite" />
</android.support.v7.widget.Toolbar>

И в activity_main.xml, у тебя есть:

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

В MainActivity.java Вы можете определить это:

private TextView title = (TextView) findViewById(R.id.toolbar_title);
title.setText("Whatever you want");
Другие вопросы по тегам