Appcompat/support-v7で導入された新しいツールバーウィジェットを使用しています。新しいGoogleのプレイストアアプリやNewsStandアプリのように、ユーザーがページを上下にスクロールしているかどうかに応じて、ツールバーを非表示/表示したいと思います。このためにツールバーウィジェットに何かが組み込まれていますか、それをFrameLayoutおよびObservableScrollViewと組み合わせて使用する必要がありますか?
私の知る限り、これはあなたのために何も組み込まれていません。ただし、Google IOソースコード、特に BaseActivity を見ることができます。 「自動非表示」を検索するか、onMainContentScrolled
を見てください
Toolbar
を非表示にするには、次のようにします。
toolbar.animate().translationY(-toolbar.getBottom()).setInterpolator(new AccelerateInterpolator()).start();
もう一度表示したい場合は、次を呼び出します。
toolbar.animate().translationY(0).setInterpolator(new DecelerateInterpolator()).start();
ツールバーを非表示にするには、次のようにします。
getSupportActionBar().hide();
したがって、スクロールリスナーが必要であり、ユーザーがスクロールするときにツールバーを非表示にする必要があります。
隠す:
getSupportActionBar().hide();
公演:
getSupportActionBar().show();
答えは簡単です。 OnScrollListener
を実装し、リスナーでツールバーを非表示/表示するだけです。たとえば、listview/recyclerview/gridviewがある場合は、例に従ってください。
MainActivity Oncreate
メソッドで、ツールバーを初期化します。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar = (Toolbar) findViewById(R.id.toolbar);
if (toolbar != null) {
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowHomeEnabled(true);
}
}
そして、OnScrollListener
を実装します
public RecyclerView.OnScrollListener onScrollListener = new RecyclerView.OnScrollListener() {
boolean hideToolBar = false;
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (hideToolBar) {
((ActionBarActivity)getActivity()).getSupportActionBar().hide();
} else {
((ActionBarActivity)getActivity()).getSupportActionBar().show();
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (dy > 20) {
hideToolBar = true;
} else if (dy < -5) {
hideToolBar = false;
}
}
};
私はからアイデアを得ました: https://stackoverflow.com/a/27063901/107977
Android Design Support Libraryは、ツールバーの表示/非表示に使用できます。
こちらをご覧ください。 http://Android-developers.blogspot.kr/2015/05/Android-design-support-library.html
そして、ここに詳細なサンプルがあります。 http://inthecheesefactory.com/blog/Android-design-support-library-codelab/en
実際には、コンテンツをスクロールしているときにツールバーを非表示/表示する方法はかなりあります。方法の1つは、Android Design Support Libraryまたはより具体的にはコーディネーターレイアウト(別名)を使用して行うことです。超強力なフレームレイアウト。
基本的にあなたがする必要があるのは、レイアウトファイルに次の構造を持つことだけで、あなたが望む結果を達成できるはずです。
<CoordinatorLayout>
<AppBarLayout>
</AppBarLayout>
<NestedScrollView>
</NestedScrollView>
</CoordinatorLayout>
私は実際にビデオを作成して、それがどのように段階的に行われるかを説明しました。お気軽にチェックして、役立つかどうかをお知らせください。ありがとう! :)
特定のフラグメントのメニューを非表示にするには:
setHasOptionsMenu(true); //Inside of onCreate in FRAGMENT:
@Override
public void onPrepareOptionsMenu(Menu menu) {
menu.findItem(R.id.action_search).setVisible(false);
}
私は同じ振る舞いを実装しようとしていますが、ここにはツールバーを表示および非表示にするコードのごまかしがあります(RecyclerViewを含むクラスに入れます)。
int toolbarMarginOffset = 0
private int dp(int inPixels){
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, inPixels, getApplicationContext().getResources().getDisplayMetrics());
}
public RecyclerView.OnScrollListener onScrollListenerToolbarHide = new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
toolbarMarginOffset += dy;
if(toolbarMarginOffset>dp(48)){
toolbarMarginOffset = dp(48);
}
if(toolbarMarginOffset<0){
toolbarMarginOffset = 0;
}
ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams)toolbar.getLayoutParams();
params.topMargin = -1*toolbarMarginOffset;
toolbar.setLayoutParams(params);
}
};
ピクセルからdpに変換するdp関数を含めましたが、明らかにツールバーの高さに合わせて設定します。 (dp(48)をツールバーの高さに置き換えます)
RecyclerViewをセットアップする場所には、次のものが含まれます。
yourListView.setOnScrollListener(onScrollListenerToolbarHide);
ただし、SwipeRefreshLayoutも使用している場合は、いくつかの追加の問題があります。
私は、RecyclerViewのアダプターの最初の要素のmarginTopを、ツールバーの高さと元のオフセットに設定する必要がありました。 (私が知っているハックのビット)。この理由は、スクロール中にrecyclerViewのmarginTopを変更するように上記のコードを変更した場合、不安な経験になることを発見したためです。それが私がそれを克服した方法です。したがって、基本的には、ツールバーがRecyclerViewの上に浮かぶようにレイアウトを設定します(クリッピング)、次のようなもの(カスタムRecyclerViewアダプタのonBindViewHolder内):
if(position==0){
ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams)holder.card.getLayoutParams();
// params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
params.topMargin = dp(10+48);
}
最後に、大きなオフセットがあるため、RecyclerViewsの更新円がクリップされるため、それをオフセットする必要があります(RecyclerViewを保持するクラスのonCreateに戻ります)。
swipeLayout.setProgressViewOffset(true,dp(48),dp(96));
これが誰かの助けになることを願っています。私の最初の詳細な答えなので、私は十分に詳細であったと思います。
このプロパティをツールバー内に追加するだけで完了です
app:layout_scrollFlags="scroll|enterAlways"
すごいじゃない
Androidという名前のAndroidライブラリがあります。設計サポートライブラリは、マテリアルドキュメントが提供するすべてのマテリアルファンシーデザインを、方法を教えなくても見つけることができる便利なライブラリです。 。
これはよく紹介されています Androidブログの投稿 。特に「折りたたみツールバー」はあなたが探しているものです。
スクロールツールバーまたは任意のタイプのヘッダーの完全なソースコードを含むライブラリとデモは、ここからダウンロードできます。
https://github.com/JohannBlake/JBHeaderScroll
ヘッダーには、ツールバー、LinearLayouts、RelativeLayouts、またはヘッダーの作成に使用するビューの種類を指定できます。
スクロール可能な領域は、ListView、ScrollView、WebView、RecyclerView、RelativeLayout、LinearLayoutなど、任意のタイプのスクロールコンテンツです。
ネストされたヘッダーもサポートされています。
確かに、Googleニューススタンドで行われているようにヘッダー(ツールバー)とスクロール可能なコンテンツを同期することは複雑な仕事です。
このライブラリでは、onScrollListenerを実装する必要はありません。
他の人が上にリストしたソリューションは、ツールバーの下のスクロール可能なコンテンツ領域の上端を最初にツールバーの下端に揃えてから、コンテンツ領域のスクロール中に必要とすることを考慮しない、半分だけのソリューションです再配置され、場合によってはサイズ変更されます。 JBHeaderScrollはこれらすべての問題を処理します。
スクロール時にツールバーのアニメーションの非表示/表示全体を実行するユーティリティクラスを実装しました。こちらの記事をご覧ください http://rylexr.tinbytes.com/2015/04/27/how-to-hideshow-Android-toolbar-when-scrolling-google-play-musics-behavior/ =。ソースコードはこちら https://github.com/rylexr/Android-show-hide-toolbar 。