2015-03-02 168 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