web-dev-qa-db-ja.com

android Lollipopツールバー:スクロール中にツールバーを非表示/表示するには?

Appcompat/support-v7で導入された新しいツールバーウィジェットを使用しています。新しいGoogleのプレイストアアプリやNewsStandアプリのように、ユーザーがページを上下にスクロールしているかどうかに応じて、ツールバーを非表示/表示したいと思います。このためにツールバーウィジェットに何かが組み込まれていますか、それをFrameLayoutおよびObservableScrollViewと組み合わせて使用​​する必要がありますか?

55
nomongo

私の知る限り、これはあなたのために何も組み込まれていません。ただし、Google IOソースコード、特に BaseActivity を見ることができます。 「自動非表示」を検索するか、onMainContentScrolledを見てください

Toolbarを非表示にするには、次のようにします。

toolbar.animate().translationY(-toolbar.getBottom()).setInterpolator(new AccelerateInterpolator()).start();

もう一度表示したい場合は、次を呼び出します。

toolbar.animate().translationY(0).setInterpolator(new DecelerateInterpolator()).start();
77
Kuno

ツールバーを非表示にするには、次のようにします。

getSupportActionBar().hide();

したがって、スクロールリスナーが必要であり、ユーザーがスクロールするときにツールバーを非表示にする必要があります。

42
Philippe

隠す:

getSupportActionBar().hide();

公演:

getSupportActionBar().show();
28
Andrey

答えは簡単です。 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

16
Abdul Rahman

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

8
hoi

実際には、コンテンツをスクロールしているときにツールバーを非表示/表示する方法はかなりあります。方法の1つは、Android Design Support Libraryまたはより具体的にはコーディネーターレイアウト(別名)を使用して行うことです。超強力なフレームレイアウト。

基本的にあなたがする必要があるのは、レイアウトファイルに次の構造を持つことだけで、あなたが望む結果を達成できるはずです。

<CoordinatorLayout>
   <AppBarLayout>
   </AppBarLayout>
   <NestedScrollView>
   </NestedScrollView>
</CoordinatorLayout>

私は実際にビデオを作成して、それがどのように段階的に行われるかを説明しました。お気軽にチェックして、役立つかどうかをお知らせください。ありがとう! :)

https://youtu.be/mEGEVeZK7Nw

2
Jack Tiong

特定のフラグメントのメニューを非表示にするには:

 setHasOptionsMenu(true); //Inside of onCreate in FRAGMENT:  


   @Override
   public void onPrepareOptionsMenu(Menu menu) {
       menu.findItem(R.id.action_search).setVisible(false);
   }
1
Parama Sudha

私は同じ振る舞いを実装しようとしていますが、ここにはツールバーを表示および非表示にするコードのごまかしがあります(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));

これが誰かの助けになることを願っています。私の最初の詳細な答えなので、私は十分に詳細であったと思います。

1
Timwillhack

このプロパティをツールバー内に追加するだけで完了です

app:layout_scrollFlags="scroll|enterAlways"

すごいじゃない

1
Rishab

Androidという名前のAndroidライブラリがあります。設計サポートライブラリは、マテリアルドキュメントが提供するすべてのマテリアルファンシーデザインを、方法を教えなくても見つけることができる便利なライブラリです。 。

これはよく紹介されています Androidブログの投稿 。特に「折りたたみツールバー」はあなたが探しているものです。

0

スクロールツールバーまたは任意のタイプのヘッダーの完全なソースコードを含むライブラリとデモは、ここからダウンロードできます。

https://github.com/JohannBlake/JBHeaderScroll

ヘッダーには、ツールバー、LinearLayouts、RelativeLayouts、またはヘッダーの作成に使用するビューの種類を指定できます。

スクロール可能な領域は、ListView、ScrollView、WebView、RecyclerView、RelativeLayout、LinearLayoutなど、任意のタイプのスクロールコンテンツです。

ネストされたヘッダーもサポートされています。

確かに、Googleニューススタンドで行われているようにヘッダー(ツールバー)とスクロール可能なコンテンツを同期することは複雑な仕事です。

このライブラリでは、onScrollListenerを実装する必要はありません。

他の人が上にリストしたソリューションは、ツールバーの下のスクロール可能なコンテンツ領域の上端を最初にツールバーの下端に揃えてから、コンテンツ領域のスクロール中に必要とすることを考慮しない、半分だけのソリューションです再配置され、場合によってはサイズ変更されます。 JBHeaderScrollはこれらすべての問題を処理します。

0
AndroidDev

スクロール時にツールバーのアニメーションの非表示/表示全体を実行するユーティリティクラスを実装しました。こちらの記事をご覧ください 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

0
rylexr