10

Возможно ли иметь координаторLayout/CollapsingToolbarLayout во фрагментах, отображаемых в основном контейнере DrawerLayout?Android, DrawerLayout + Fragments + CollapsingToolbarLayout

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

Неужели кто-то достиг этого, или у вас есть указатели на это? Благодарю.

EDIT: Я сосредотачивались некоторые усилия положить один панель инструментов в DrawerLayout, означало, чтобы остаться там все время, но не смог получить его для прокрутки (на API Nexus5 22). В this question упоминается, что основным видом является 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> 
+0

Почему вам нужна другая панель инструментов, так как андроид позволяет фрагментам изменять панель инструментов внутри своего класса. Поэтому я предлагаю вам изменить панель инструментов внутри фрагмента, а не использовать другую панель инструментов для каждого фрагмента. – EEJ

+0

Интересно ... это то, что я пытаюсь сделать сейчас. Я дам вам знать – d4c0d312

ответ

2

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

<?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 активность как обычный

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.

+0

Наконец-то мне удалось объединить панель навигации + CoordinatorLayout + Toolbar + Fragments + TabLayout + AppBarLayout благодаря этому вопросу, учебному пособию NavigationDrawer android4devs и учебнику NavigationDrawer от CodePath. – Avamander

5

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

В любом случае ниже представлены мои файлы макета, так как для кода 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 + Фрагменты + CollapsingToolbarLayout "

+0

Это отличные предложения.Однако мне бы это понравилось, если бы вы могли помочь мне адаптировать его к моей ситуации. Мне также нужно использовать ViewPager для работы с TabLayout. Я изменил CollapsedToolbar с помощью TabLayout, и это нормально, но я не знаю, где позиционировать ViewPager, чтобы он не мешал FrameLayout. – iBobb

+0

@iBobb Можете ли вы дать мне свои файлы макета (activity_main.xml, app_bar_main.xml и content_main.xml), чтобы я мог попробовать с вашим делом – OmarBizreh

+0

Эй, спасибо за ваше время, я был в этой проблеме в течение нескольких недель. Вы можете найти мои xml-файлы в моем отдельном вопросе здесь: http://stackoverflow.com/questions/35590799/avoid-viewpager-going-under-toolbar Мой ViewPager не отображается там, так как теперь он находится в макете моего фрагмента хоста (он загружен в content_main_frame). Тем не менее, это происходит под панелью инструментов. Когда я попытался поместить его где-нибудь в эти 3 файла макета, это просто не видно вообще. – iBobb

0

У меня был та же проблема, но я не нуждался в 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> 

Надеется, что это помогает!