Использование include и привязка данных для повторного использования макета не работает - PullRequest
0 голосов
/ 06 июня 2019

Мне удалось добавить параметр в мои включения, чтобы я мог повторно использовать макет с немного другой конфигурацией.Но он не отображается в предварительном просмотре Android Studio (я не знаю, может ли Android это сделать), и у меня также есть проблемы с его надуванием.Я не хочу связывать его с действием, потому что я хочу создать растровое изображение вида, поэтому мне нужно накачать и нарисовать его вручную.

Макет для включения:

<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable name="myText" type="String"/>
    </data>
<LinearLayout
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_marginTop="27dp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:gravity="center_horizontal"
    android:orientation="horizontal"
    >

    <TextView
            android:id="@+id/months"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{myText}" />
 </LinearLayout>
</layout>

Используетсяздесь:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:bind="http://schemas.android.com/apk/res-auto">
    <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center">
            <include
                        layout="@layout/counter_4_1"
                        bind:myText="@{`Hello World`}" />
    </FrameLayout>
</layout>

Это работало без привязки данных:

View checkIds = LayoutInflater.from(context).inflate(R.layout.mylayout, null);
((TextView) checkIds.findViewById(viewId)).setText(text);
int specWidth = View.MeasureSpec.makeMeasureSpec(0 /* any */, View.MeasureSpec.UNSPECIFIED);
        checkIds.measure(specWidth, specWidth);
        checkIds.layout(0, 0, checkIds.getMeasuredWidth(), checkIds.getMeasuredHeight());

        Bitmap b = Bitmap.createBitmap( checkIds.getMeasuredWidth(), checkIds.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas(b);
        checkIds.draw(c);

С привязкой данных я попытался

View checkIds = DataBindingUtil.inflate(LayoutInflater.from(context),Tools.getLayoutResource(context,countdownSettings.countdownStyle), null,false).getRoot();

Я также включил dataBinding {enabled = true} вприложение build.gradle.

Но данные не отображаются в представлении.

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Вам также необходимо использовать ту же переменную данных в основном макете, где вы вызываете

    <?xml version="1.0" encoding="utf-8"?>
    <layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:bind="http://schemas.android.com/apk/res-auto">
    <data>
        <variable name="myText" type="String"/>
    </data>
    <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center">
            <include
                 layout="@layout/counter_4_1"
                 bind:myText="@{myText}" />
    </FrameLayout>
</layout>

и затем вы можете передать ту же переменную, т. Е. Из вашей деятельности.

public class UserDetailActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        YourMainLayout mBinding = DataBindingUtil
                .setContentView(this, R.layout.your_main_layout);

        String myText = "Hello World";

        mBinding.setMyText(myText);
    }
}
0 голосов
/ 06 июня 2019

Сделайте еще одну переменную для передачи String во включенном дочернем макете

Ваш включаемый макет должен выглядеть следующим образом:

    <data>
        <variable name="myText" type="String"/>
    </data>
     <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center">

               <include
                   layout="@layout/counter_4_1"
                   bind:myText='@{myText ?? ""}' />
    </FrameLayout>

Проверка на ноль @{myText??""

Дайте мне знать, если все еще проблема.

...