23

я в настоящее время возникли проблемы с FrameLayout в CoordinatorLayout из Android библиотеки дизайн-поддержки, тогда как я следовал инструкциям из этой post при создании вкладок.Android SupportLib - FrameLayout в CoordinatorLayout с AppBarLayout потребляя весь экран высоты

В основном большинство вещей работают, как и ожидалось, контейнер-фрагменты завышены в FrameLayout и ихние Таб-фрагменты correclty добавлены в ViewPager в виде вкладок (это нужно таким образом, потому что у меня есть многочисленные фрагменты, которые должны повторно использовать макет) ,

Проблема, которую я борюсь с, что FrameLayout (и в результате также вкладка-фрагменты) поглощает весь экран-высоту, так что перекрывает Toolbar и TabLayout. Для того, чтобы визуализировать проблему, я создал следующий образ:

Visualized issue

Base-Layout с CoordinatorLayout, Toolbar и TabLayout:

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

    <android.support.design.widget.AppBarLayout 
     android:id="@+id/appBarLayout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 

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

     <android.support.design.widget.TabLayout 
      android:id="@+id/tabLayout" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" /> 

    </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> 

Раздельные макет, используемый фрагментами завышены в container:

<android.support.v4.view.ViewPager 
    android:id="@+id/viewPager" 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

Все фрагменты завышены моим BaseFragment -класса (на другой пост на SO вызова inflater.inflate(getLayoutRes(), null); был вопрос вызывает ту же проблему)

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    return inflater.inflate(getLayoutRes(), container, false); 
} 

Если я заменю CoordinatorLayout с нормальным LinearLayout в FrameLayout начинается ниже AppBarLayout как и ожидалось, но для documentationAppBarLayout для большинства его функций должен быть прямым дочерним элементом CoordinatorLayout.

Я мог бы просто добавить marginTop в FrameLayout, но я хотел бы знать, есть ли подходящее решение для этого. Спасибо заранее за любые подсказки!

ответ

34

Переведите app:layout_behavior="@string/appbar_scrolling_view_behavior" в FrameLayout - этот атрибут должен находиться на прямом дочернем объекте CoordinatorLayout.

+0

Это решило ту же проблему, что и я, спасибо, но я понятия не имею, почему. Что делает 'appbar_scrolling_view_behavior' точно ...? – Micro

+1

@MicroR - Я бы предложил прочитать Javadoc из [AppBarLayout.ScrollingViewBehavior [(http://developer.android.com/reference/android/support/design/widget/AppBarLayout.ScrollingViewBehavior.html) или посмотреть [источник код] (https://android.googlesource.com/platform/frameworks/support/+/refs/heads/master/design/src/android/support/design/widget/AppBarLayout.java#1128) - он добавляет требуемый padding, чтобы не перекрывать «AppBarLayout», а также разрешать 'AppBarLayout' отвечать на прокрутку, если накладывать прокручиваемое представление (например,' NestedScrollView' или 'RecyclerView') – ianhanniballake

+0

@ianhanniballake Я использовал предложение ur, но проблема заключается в том, что я получаю какое-то дополнительное пространство между моим tablayout и framelayout. Я применил цвет bk для анализа причины, но в пользовательском интерфейсе отсутствует фоновый цвет. – Erum

 Смежные вопросы

  • Нет связанных вопросов^_^