Как получить доступ к вложенному представлению, используя привязку данных и компонент навигации? - PullRequest
4 голосов
/ 01 июля 2019

Я использую Android привязку данных и компонент навигации. У меня есть activity_member макет. Этот макет включает в себя другой макет:

    <include
    layout="@layout/app_bar_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/appbar" />

и в app_bar_main макет включает другой макет:

        <include
        android:id="@+id/member"
        layout="@layout/content_main" />

В content_main Я хочу поместить основной хост fragmnet для использования компонента навигации:

  <?xml version="1.0" encoding="utf-8"?>
   <layout xmlns:app="http://schemas.android.com/apk/res-auto">

    <androidx.constraintlayout.widget.ConstraintLayout 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"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        tools:context=".ui.MembersPage.MemberActivity"
        tools:showIn="@layout/app_bar_main">
        <fragment
            android:id="@+id/my_nav_host_fragment"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="500dp"
            app:defaultNavHost="true"
            app:navGraph="@navigation/navigation"
            tools:layout_editor_absoluteX="-29dp"
            tools:layout_editor_absoluteY="215dp"/>
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

Это фрагмент хоста в графе навигации. Мне нужно получить доступ к recyclerView в классе Java, но я не могу:

        binding.appbar.member.membersRecycler.setLayoutManager(new GridLayoutManager(this, 3));

и:

     <?xml version="1.0" encoding="utf-8"?>
<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"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context=".MembersFragment"
    >
    <android.support.v7.widget.RecyclerView
        android:id="@+id/membersRecycler"
        android:layout_width="400dp"
        android:layout_height="wrap_content" />
</FrameLayout>

Как получить доступ к вложенным элементам в этой ситуации, например, как recyclerView id здесь?

Ответы [ 2 ]

2 голосов
/ 01 июля 2019

Я думаю, вы должны поместить тег RecyclerView в макет фрагмента и использовать DataBinding в классе фрагмента.

0 голосов
/ 01 июля 2019

Я приведу пример того, как вы можете получить доступ к представлениям в вашей ситуации.

Допустим, у вас есть String title внутри объекта класса myObject для перехода из activity_member в app_bar_mainи ваш объект определен следующим образом в activity_member.

 <data>
    <variable
      name="myObject"
      type="com.example.model.Object"/>
  </data>

Теперь, чтобы передать строку с именем title, которая находится внутри вашего myObject в app_bar_main, вам нужно определить переменную в app_bar_main вот так

 <data>
    <variable
      name="title"
      type="String"/>
  </data>

после этого вы сможете передать название с того места, которое вы включили app_bar_main в activity_member макет.

 <include
    layout="@layout/app_bar_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/appbar" 
    app:title = "@{myObject.title}"/>

Также,теперь вы сможете получить доступ ко всем представлениям, которые находятся внутри app_bar_main.Допустим, у вас есть представление с идентификатором myTextView

TextView textView = binding.appbar.myTextView;
...