![](/img/trans.png)
[英]Hide toolbar in activity by scrolling a recyclerview inside the Fragment?
[英]Hide toolbar on scroll when the using a recyclerview inside a Fragment instead of an Activity
我正在嘗試根據解釋得很好的出色文章來隱藏/顯示工具欄(或任何視覺元素)的策略: http : //mzgreen.github.io/2015/02/15/How-to-hideshow-清單出現問題時的工具欄%28part1%29 /
但就我而言,我使用的是Fragment而不是活動來保存recycleview。 我的問題是未應用填充,因此第一個元素在工具欄下,並且我還有另一個奇怪的行為,因為工具欄也在狀態欄下。 我不知道這里發生了什么。 以下是我的“動人作品”:
BasicActivity.java:基於上一篇文章中給出的內容,但是將Fragment部分中的recycleview部分移開了。 它還公開了show和hide方法,以允許片段訪問它:
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"/>
Fragment RecycleFragment.java:公共類RecycleFragment擴展了Fragment {
@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;
}
片段的布局只是一個recyclerviewfragment_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"/>
回收站的適配器和觀察器與文章相同,並且不影響行為。
代碼有什么問題?
更新:下面指出了一個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” =“ true”元素。 因此,必須如下所示:
<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
您的fragment_recycler.xml
文件缺少paddingTop
和clipToPadding
屬性。 它看起來應該像這樣:
<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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.