Android: Как просмотреть нестандартный фрагмент XML в Android Studio - PullRequest
0 голосов
/ 04 декабря 2018

Хорошо, это может быть немного сложно, но мне интересно, возможно ли это.

Скажем, у меня есть основной макет активности - который содержит include, который включает в себя один конкретный фрагмент -с именем activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <!-- some other things... -->
    <include
        android:id="@+id/mainContent"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintBottom_toTopOf="@+id/itemBelow"
        app:layout_constraintTop_toBottomOf="@+id/itemAbove">
        <!-- load fragments here -->
    </include>
    <!-- some other things... -->
</android.support.constraint.ConstraintLayout>

и у меня есть макет фрагмента, например: fragment_1.xml.

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!-- something... -->
</android.support.constraint.ConstraintLayout>

Я знаю в activity_main.xml, я могу просмотреть fragment_1.xml с помощьюдобавив tools:layout="@layout/fragment_1" в include;

и в fragment_1.xml, я могу просмотреть activity_main.xml, добавив tools:showIn="@layout/activity_main" в базу ConstraintLayout.

Но вот идетвопрос: для многократного использования макета, может быть другой фрагмент, который показан в include, и если я последую методу выше - скажем, в fragment_2.xml я напишу:

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:showIn="@layout/activity_main">
    <!-- something... -->
</android.support.constraint.ConstraintLayout>

Я бы просто увидел fragment_1.xml внутри activity_main.xml в предварительном просмотре.

Есть ли какой-либо способ, который показывает fragment_2.xml внутри activity_main.xml - при предварительном просмотре fragment_2.xml в AndroidStudio?

Более того: если внутри activity_main.xml будет больше include s, будет ли метод все еще работать?

1 Ответ

0 голосов
/ 04 декабря 2018

То, что вы хотите, невозможно (на данный момент, во всяком случае).

Предварительный просмотр макета не выполняет никакого кода Android (ни Java, ни Kotlin).Все, что он делает, это анализирует дерево XML и показывает вам, что говорит XML, чтобы показать.

Из tools документации :

предварительный просмотр макета не можетвыполнить код активности, который обычно применяет макет

Когда вы используете tools:layout для тега <fragment>, вы говорите «показать этот макет вместо серого квадрата».Когда вы используете tools:showIn в корневом теге макета, вы говорите: «показать этот другой макет вместо обычного предварительного просмотра».Здесь нет «интеллекта», который мог бы определить, что вы просите предварительный просмотр показать ваше представление «внутри» другого макета, который его не включает.Он просто вслепую показывает предварительный просмотр макета activity_main (который, в свою очередь, слепо включает макет fragment_1).


Чтобы увидеть это в чрезвычайно очевидных терминах, представьте эти два макета:

  • activity_main.xml
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="first"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="second"/>

</LinearLayout>
  • itemview.xml
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    tools:showIn="@layout/activity_main">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="HELLO WORLD"/>

</FrameLayout>

Несмотря на то, что нетТеги <fragment> или <include> в activity_main.xml, предварительный просмотр редактора макета для itemview.xml покажет только «первое» и «второе».Атрибут tools:showIn просто полностью перекрывает обычный предварительный просмотр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...