Android, DrawerLayout + Фрагменты + CollapsingToolbarLayout

Возможно ли иметь CoordinatorLayout / CollapsingToolbarLayout во фрагментах, показанных в основном контейнере DrawerLayout?

Ответ на другой вопрос предполагает, что каждый фрагмент может иметь свою собственная панель инструментов. Но это не работает с ActionBarDrawerToggle, так как для ссылки на панель открытия/закрытия требуется панель инструментов. поведение.

Кто-нибудь достиг этого, или у вас есть указатели по этому поводу? Спасибо.

EDIT: я приложил некоторые усилия, чтобы поместить одну панель инструментов в DrawerLayout, которая должна была оставаться там все время, но не смог заставить ее прокручиваться (на Nexus5 API 22). В этом вопросе упоминается, что CoordinatorLayout должен быть основным видом. Так что, возможно, вставка его в DrawerLayout (как показано ниже) не сработает.

<android.support.v4.widget.DrawerLayout ...>

    <!-- main content -->
    <android.support.design.widget.CoordinatorLayout ...>

        <android.support.design.widget.AppBarLayout ...>

            <android.support.design.widget.CollapsingToolbarLayout ...>

                <ImageView .../>

                <android.support.v7.widget.Toolbar .../>

            </android.support.design.widget.CollapsingToolbarLayout>

        </android.support.design.widget.AppBarLayout>

        <android.support.v7.widget.RecyclerView .../>

    </android.support.design.widget.CoordinatorLayout>

    <!-- navigation drawer -->
    <android.support.design.widget.NavigationView ...>

        <!-- drawer content -->
        <fragment .../>

    </android.support.design.widget.NavigationView>

</android.support.v4.widget.DrawerLayout>

comment
Зачем вам нужна другая панель инструментов, поскольку Android позволяет фрагментам изменять панель инструментов внутри своего класса. Поэтому я предлагаю вам изменить панель инструментов внутри фрагмента вместо использования разных панелей инструментов для каждого фрагмента.   -  person EEJ    schedule 06.08.2015
comment
Интересно ... это то, что я пытаюсь сделать сейчас. Я дам Вам знать   -  person d4c0d312    schedule 29.09.2015


Ответы (3)


На самом деле, да, вы можете. Я искал то же самое, и ссылка из вашего вопроса привела меня к это из записи блога Google

Во всяком случае, ниже мои файлы макета, что касается java-кода, я ничего не менял, и вызов фрагмента остается прежним.

activity_main.xml (основной файл)

<?xml version="1.0" encoding="utf-8"?>

<android.support.v4.widget.DrawerLayout 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:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

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

    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer" />

</android.support.v4.widget.DrawerLayout>

app_bar_main.xml (макет панели навигации)

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 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:context=".MainActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="192dp"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/toolbar_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <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_collapseMode="pin"
                app:layout_scrollFlags="scroll|enterAlways"
                app:popupTheme="@style/AppTheme.PopupOverlay" />
        </android.support.design.widget.CollapsingToolbarLayout>
    </android.support.design.widget.AppBarLayout>

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

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="@dimen/fab_margin"
        android:src="@android:drawable/ic_dialog_email" />

</android.support.design.widget.CoordinatorLayout>

content_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.NestedScrollView 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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context=".MainActivity"
    tools:showIn="@layout/app_bar_main">

    <FrameLayout
        android:id="@+id/content_main_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</android.support.v4.widget.NestedScrollView>

И теперь у вас есть "DrawerLayout + Fragments + CollapsingToolbarLayout"

person JustADev    schedule 20.01.2016
comment
Это отличные предложения. Тем не менее, я был бы рад, если бы вы помогли мне адаптировать его к моей ситуации. Мне также нужно использовать ViewPager для работы с TabLayout. Я изменил CollapsedToolbar на TabLayout, и все в порядке, но я понятия не имею, где расположить ViewPager, чтобы он не мешал FrameLayout. - person iBobb; 24.02.2016
comment
@iBobb, не могли бы вы дать мне свои файлы макета (activity_main.xml, app_bar_main.xml и content_main.xml), чтобы я мог попробовать с вашим случаем? - person JustADev; 24.02.2016
comment
Эй, спасибо за ваше время, я был в этой проблеме в течение нескольких недель. Вы можете найти мои xml-файлы в моем отдельном вопросе здесь: .com/questions/35590799/ Мой ViewPager там не виден, поскольку сейчас он находится в макете фрагмента моего хоста (он загружается в content_main_frame). Однако таким образом он проходит под панелью инструментов. Когда я попытался поместить его где-нибудь в эти 3 файла макета, он просто не виден вообще. - person iBobb; 24.02.2016
comment
@iBobb Извините, я проверю это в эти выходные, я не мог сделать это раньше - person JustADev; 26.02.2016
comment
Не волнуйтесь, на данный момент мне удалось найти решение, надеюсь, лучшее, так что теперь все работает. Я разместил это как ответ на мой вопрос выше. Спасибо, в любом случае! - person iBobb; 26.02.2016

Этот макет работает для меня

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_gravity="left"
    android:layout_width="match_parent" android:layout_height="match_parent"
    tools:context=".BaseDrawerActivity"
    android:foregroundGravity="left">


<android.support.design.widget.CoordinatorLayout
    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:fitsSystemWindows="true"
    tools:context=".myapp">

    <android.support.design.widget.AppBarLayout
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:theme="@style/AppTheme.AppBarOverlay">

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

    </android.support.design.widget.AppBarLayout>

    <FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</android.support.design.widget.CoordinatorLayout>


<!-- The drawer -->
<se.emilsjolander.stickylistheaders.StickyListHeadersListView
    android:id="@+id/drawer"
    android:layout_width="300dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:choiceMode="singleChoice"
    android:divider="@android:color/transparent"
    android:dividerHeight="0dp"
    style="@style/BaseStyle_Dark" />

Initialise the activity as normal

public class BaseDrawerActivity extends AppCompatActivity implements MenuInterface {

private DrawerLayout mDrawerLayout;
private StickyListHeadersListView menuItemListView;
private static MenuItemAdapter menuItemAdapter;
private ActionBarDrawerToggle mDrawerToggle;

private Toolbar toolbar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_drawer);
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        menuItemListView = (StickyListHeadersListView) findViewById(R.id.drawer);
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        if (savedInstanceState == null) {

        }

        mDrawerToggle = new ActionBarDrawerToggle(this,mDrawerLayout,toolbar,R.string.home_open,R.string.home_close);
        mDrawerLayout.setDrawerListener(mDrawerToggle);
    }


    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        // Sync the toggle state after onRestoreInstanceState has occurred.
        mDrawerToggle.syncState();

    }

Это позволит вам добавить обычные функции CoordinatorLayout.

person d4c0d312    schedule 29.09.2015
comment
Наконец-то мне удалось объединить панель навигации + CoordinatorLayout + панель инструментов + фрагменты + TabLayout + AppBarLayout благодаря этому ответу, учебнику android4devs NavigationDrawer и учебнику CodePath NavigationDrawer. - person Avamander; 23.08.2016

У меня была та же проблема, но мне не нужен был ImageView, так что вот мое решение:

<android.support.v4.widget.DrawerLayout
    android:id="@+id/drawer"
    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:fitsSystemWindows="true"
    tools:context=".MainActivity">

    <android.support.design.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>
        </android.support.design.widget.AppBarLayout>

        <FrameLayout
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:elevation="@dimen/toolbar_elevation"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
    </android.support.design.widget.CoordinatorLayout>

    <android.support.design.widget.NavigationView
        android:id="@+id/navigation"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header"
        app:menu="@menu/drawer_view"/>
</android.support.v4.widget.DrawerLayout>

Надеюсь, поможет!

person Gnzlt    schedule 17.02.2016