2015-03-02 165 views
1

我试图适应隐蔽策略/示出了从很好地解释和大条工具栏(或任何视觉元素): http://mzgreen.github.io/2015/02/15/How-to-hideshow-Toolbar-when-list-is-scroling%28part1%29/隐藏工具栏

但在我的情况下,我正在使用片段来保存recycleview而不是活动。我的问题是没有应用填充,因此第一个元素位于工具栏下方,而且我还有另一个奇怪的行为,因为工具栏也位于状态栏下方。我不知道这里发生了什么事。 以下是我的“移动作品”:

BasicActivity.java:基于上一篇文章中给出的一个,但将删除recycleview部分,就像将在Fragment部分上一样。此外,它暴露的显示和隐藏方法允许片段访问它:

public class BasicActivity extends ActionBarActivity { 

    private Toolbar mToolbar; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_basic); 
     FragmentManager fragmentManager = getFragmentManager(); 
     fragmentManager.beginTransaction() 
       .replace(R.id.container,new RecycleFragment()) 
       .commit(); 
     overridePendingTransition(0, 0); 
     initToolbar(); 
    } 

    private void initToolbar() { 
     mToolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(mToolbar); 
     setTitle(getString(R.string.app_name)); 
     mToolbar.setTitleTextColor(getResources().getColor(android.R.color.white)); 
    } 

    public void hideViews() { 
     mToolbar.animate().translationY(-mToolbar.getHeight()).setInterpolator(new AccelerateInterpolator(2)); 

    } 

    public void showViews() { 
     mToolbar.animate().translationY(0).setInterpolator(new DecelerateInterpolator(2)); 
    } 

} 

我activiy_basic.xml如下:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <FrameLayout android:id="@+id/container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
    /> 
    <include layout="@layout/toolbar_actionbar" /> 
</FrameLayout> 

布局toolbar_actionbar.xml

<android.support.v7.widget.Toolbar 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/toolbar" 
    android:layout_width="match_parent" 
    android:layout_height="?attr/actionBarSize" 
    android:background="?attr/colorPrimary" 
    android:clipToPadding="false"/> 

片段RecycleFragment.java: 公共类RecycleFragment扩展片段{

@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, 
            Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_recycler, container, false);   
    return view; 
} 


@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    initRecyclerView(view); 

} 

private void initRecyclerView(View view) { 
    RecyclerView recyclerView = (RecyclerView)view.findViewById(R.id.recyclerView); 
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 
    RecyclerAdapter recyclerAdapter = new RecyclerAdapter(createItemList()); 
    recyclerView.setAdapter(recyclerAdapter); 

    recyclerView.setOnScrollListener(new HidingScrollListener() { 
     @Override 
     public void onHide() { 
      ((BasicActivity)getActivity()).hideViews(); 
     } 

     @Override 
     public void onShow() { 
      ((BasicActivity)getActivity()).showViews(); 
     } 
    }); 
} 

private List<String> createItemList() { 
    List<String> itemList = new ArrayList<>(); 
    for(int i=0;i<20;i++) { 
     itemList.add("Item "+i); 
    } 
    return itemList; 
} 

} 而碎片的布局仅仅是一个recyclerview fragment_recycler.xml:

<android.support.v7.widget.RecyclerView 
xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/recyclerView" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/> 

的适配器和回收商的viewholder是一样的文章,它们不影响行为。

代码有什么问题?

更新: MichałZ.下面指出。少了什么是对Recyclerview视图 的paddingTop和clipptoPadding所以最终的XML应该是:

<android.support.v7.widget.RecyclerView 
     android:id="@+id/recyclerView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:paddingTop="?attr/actionBarSize" 
     android:clipToPadding="false"/> 

,解决状态栏重叠的问题,它需要添加一个“fitsystemwindows” =“真”的元素活动布局。因此,它必须是以下几点:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true">   
    <FrameLayout android:id="@+id/container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
    /> 
    <include layout="@layout/toolbar_actionbar" /> 
</FrameLayout> 

UPDATE2 的fitSystemWindows只需要当主题设置状态栏半透明

回答

5

fragment_recycler.xml文件丢失paddingTopclipToPadding属性。 它应该是这样的:

<android.support.v7.widget.RecyclerView 
     android:id="@+id/recyclerView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:paddingTop="?attr/actionBarSize" 
     android:clipToPadding="false"/> 

而且还从toolbar_actionbar.xml删除clipToPadding

+0

太棒了!这解决了第一行的问题。现在剩下的唯一问题是状态栏与工具栏重叠。 – gpulido 2015-03-03 06:44:52

+0

添加fitsystemwindows = true解决了状态栏填充问题 – gpulido 2015-03-03 06:56:47

+0

您是否试图从'toolbar_actionbar.xml'中删除'android:clipToPadding =“false”'而不是添加'fitSystemWindows =“true”'? – 2015-03-03 08:00:14