2015-07-06 3 views
3

Я пытаюсь скрыть свою панель инструментов в прокрутке RecyclerView, и до сих пор кажется, что она скрыта, но она оставляет белый пробел с ней. Я уверен, что это как-то связано с наложением макета MainActivity и фрагмента в FrameLayout.Панель инструментов, оставляющая пустое пространство с укрытием на прокрутке RecyclerView

why is this happening to me ._.

Вот мой activity_main.xml. Мне нужен FrameLayout, потому что я загружаю разные фрагменты с выбором элемента в навигационном ящике.

<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/drawer" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:elevation="7dp" 
    tools:context=".MainActivity" 
    android:fitsSystemWindows="true"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 

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

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

    </LinearLayout> 

    <android.support.design.widget.NavigationView 
     android:id="@+id/navigation_view" 
     android:layout_height="match_parent" 
     android:layout_width="match_parent" 
     android:layout_gravity="start" 
     app:headerLayout="@layout/header" 
     app:menu="@menu/drawer" /> 

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

И вот код во фрагменте, который содержит RecyclerView.

... 
@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View v = inflater.inflate(R.layout.fragment_main, container, false); 

     getActivity().setTitle("Unit One"); 

     rv = (RecyclerView) v.findViewById(R.id.rv); 
     rv.setHasFixedSize(true); 

     llm = new LinearLayoutManager(getActivity()); 
     rv.setLayoutManager(llm); 

     initializeData(); 
     initializeAdapter(); 

     rv.addOnScrollListener(showHideToolbarListener = new RecyclerViewUtils.ShowHideToolbarOnScrollingListener(MainActivity.toolbar)); 

     if (savedInstanceState != null) { 
      showHideToolbarListener.onRestoreInstanceState((RecyclerViewUtils.ShowHideToolbarOnScrollingListener.State) savedInstanceState 
        .getParcelable(RecyclerViewUtils.ShowHideToolbarOnScrollingListener.SHOW_HIDE_TOOLBAR_LISTENER_STATE)); 
     } 

     return v; 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     outState.putParcelable(RecyclerViewUtils.ShowHideToolbarOnScrollingListener.SHOW_HIDE_TOOLBAR_LISTENER_STATE, 
       showHideToolbarListener.onSaveInstanceState()); 
     super.onSaveInstanceState(outState); 
    } 

И, наконец, RecyclerView макет в fragment_main.xml:

<android.support.v7.widget.RecyclerView 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:paddingLeft="8dp" 
     android:paddingRight="8dp" 
     android:orientation="vertical" 
     android:scrollbars="vertical" 
     android:id="@+id/rv" /> 

Это следовать до моего other post, но я хотел бы задать новый вопрос, так как я пробуя different method на этот раз (не читайте весь пост, см. редактирование внизу). Вот его MainActivity и фактический scrolling listener code.

Прошу прощения, если мне кажется, что я говорю «вот мое дерьмо, исправьте это», но я потратил почти два часа на поиски возможного решения этого. Как всегда, я очень ценю помощь.

+0

опубликуйте элемент макета 'RecyclerView'. Вы использовали «CardView»? У вас есть эффект возвышения или эффект краевой тени ... – SilentKnight

ответ

5

Я думаю, что translateY, который вы используете для анимации на панели инструментов, только сдвигает то, что нарисовано на экране, а не на самом месте обзора. Это означает, что вид, удерживающий панель инструментов, по-прежнему занимает это пространство вверху в линейной компоновке.

Используйте тот же макет, который он использует в своем main_activity.xml. Вы также можете использовать FrameLayout. Важно то, что вы помещаете панель инструментов поверх RecyclerView (ниже в xml) и добавляете верхнее дополнение к RecyclerView, равное высоте панели инструментов.

<android.support.v7.widget.RecyclerView 
    android:clipToPadding="false" 
    android:paddingTop="?attr/actionBarSize" /> 

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

Я собираюсь отметить этот ответ, потому что это наиболее правильно для кого-либо еще, кто наткнулся на этот вопрос. Я изменил свой LinearLayout на FrameLayout и поместил панель инструментов ниже дочернего FrameLayout (который используется для фрагмента). Дополнительные кредиты: https://www.reddit.com/r/androiddev/comments/3ca6gt/stackoverflow_question_problems_with_toolbar/cstn8t6 – wasimsandhu

2

Лучший подход заключается в использовании нового Design Support Library и ее CoordinatorLayout:

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
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:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     app:layout_scrollFlags="scroll|enterAlways" /> 
</android.support.design.widget.AppBarLayout> 
<android.support.v7.widget.RecyclerView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

Для более Например, вы можете получить вдохновение от Криса BaneS' демонстрационного приложения CheeseSquare или this tutorial.

+0

Этот подход не работал для меня, так как мой DrawerLayout является корневым элементом в моем main_activity.xml – wasimsandhu

+0

Вот хороший учебник рассказывая вам, как это сделать, используя RecyclerView. https://mzgreen.github.io/2015/02/15/How-to-hideshow-Toolbar-when-list-is-scroling(part1)/ Однако это также говорит вам добавить paddingTop = actionBarSize в раскладка. Мне действительно не нравился этот подход, но я решил это сейчас. – JaydeepW

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