滚动选项卡中的片段时隐藏/显示工具栏

我在我的Android应用程序中添加了新的ToolbarTablayoutViewpager 。 我为我的3个标签提供了碎片,并且工作正常。 但问题是,当我向上滚动我的工具栏时,不会隐藏。 我希望当我滚动我的片段时它应该隐藏。 还有一件事,我在片段中使用Webview。 我的代码如下。

MainActivity.Java

 public class MainActivity extends AppCompatActivity { TabLayout tabLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); setupToolbar(); setupTablayout(); } private void setupToolbar() { // TODO Auto-generated method stub Toolbar toolbar = (Toolbar) findViewById(R.id.toolbarsdfs); if (toolbar != null) { setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true);} } private void setupTablayout() { // TODO Auto-generated method stub tabLayout = (TabLayout) findViewById(R.id.tabLayout); tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); tabLayout.addTab(tabLayout.newTab().setText("Tab 1")); tabLayout.addTab(tabLayout.newTab().setText("Tab 2")); final ViewPager viewPager = (ViewPager) findViewById(R.id.pager); final PagerAdapter adapter = new PagerAdapter (getSupportFragmentManager(), tabLayout.getTabCount()); viewPager.setAdapter(adapter); viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { viewPager.setCurrentItem(tab.getPosition()); } @Override public void onTabUnselected(TabLayout.Tab tab) { } @Override public void onTabReselected(TabLayout.Tab tab) { } }); } } 

main.xml中

        

PagerAdapter.Java

 public class PagerAdapter extends FragmentStatePagerAdapter { int mNumOfTabs; public PagerAdapter(FragmentManager fm, int NumOfTabs) { super(fm); this.mNumOfTabs = NumOfTabs; } @Override public Fragment getItem(int position) { switch (position) { case 0: Fragment_Feeds tab1 = new Fragment_Feeds(); return tab1; case 1: Fragment_Facts tab2 = new Fragment_Facts(); return tab2; default: return null; } } @Override public int getCount() { return mNumOfTabs; } } 

Fragment_Feeds.java

     public class Fragment_Feeds extends Fragment { SwipeRefreshLayout swipeView; WebView myWebView; ProgressBar progressBar; final static String myBlogAddr = "http://myblog.com"; String myUrl; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragmentfeeds, container, false); swipeView = (SwipeRefreshLayout) view.findViewById(R.id.swipe); myWebView = (WebView) view.findViewById(R.id.webview); progressBar = (ProgressBar) view.findViewById(R.id.progressBar); myWebView.setWebViewClient(new MyWebViewClient()); WebSettings webSettings = myWebView.getSettings(); webSettings.setJavaScriptEnabled(true); myWebView.setOverScrollMode(View.OVER_SCROLL_NEVER); myWebView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); myWebView.setHorizontalScrollBarEnabled(false); myWebView.loadUrl("http://myblog.com"); swipeView.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { myWebView.loadUrl("http://myblog.com"); }}); return view; } private class MyWebViewClient extends WebViewClient { @Override public void onPageFinished(WebView view, String url) { swipeView.setRefreshing(false); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { myUrl = url; view.loadUrl(url); return true; } @Override public void onReceivedError(WebView view, int errorCod,String description, String failingUrl) { myWebView.loadUrl("file:///android_asset/error_page.html"); } } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.main, menu); super.onCreateOptionsMenu(menu, inflater); } } 

    fragmentfeeds.xml

       s    

    我想要的是?

    我想要的是,当我向上滚动webview时,工具栏也应该向上滚动并隐藏,当我向下滚动工具栏时应该尽快回来。

    Related of "滚动选项卡中的片段时隐藏/显示工具栏"

    尝试这个。

    main.xml中

            

    fragmentfeeds.xml

      < ?xml version="1.0" encoding="utf-8"?>         

    首先,您应该将您的webview移动到NestedScrollView并将’android:isScrollContainer’属性设置为’false’值。 https://developer.android.com/reference/android/support/v4/widget/NestedScrollView.html

    其次,您应该将ViewPager移到AppBarLayout之外。 所以,你的main.xml应该是这样的:

     < ?xml version="1.0" encoding="utf-8"?>           

    AppBarLayout childern只有在有标志app:layout_scrollFlags时才会隐藏

    阅读更多关于实现支持设计库的信息:
    https://android-developers.googleblog.com/2015/05/android-design-support-library.html

    您应该将ViewPager移到AppBarLayout之外并向ViewPager app:layout_behavior="@string/appbar_scrolling_view_behavior"添加行为app:layout_behavior="@string/appbar_scrolling_view_behavior"

    我写了一个完整的例子! https://github.com/erikcaffrey/AndroidDesignSupportLibrary

    希望对你有所帮助!

    看一下

    • 如何使用新的设计库API正确隐藏和显示操作栏?
    • Android的ObservableScrollView

    对不起我的英语。

    我将告诉你我是如何为我的应用程序制作的(最小sdk:14,目标sdk:22)。 我不使用片段,我的活动中只有一个webview,但处理程序是相同的。 问题是当你在webview中进行滚动时,Android不像滚动事件那样处理它,webview处理他自己的事件。

    首先,我在res文件夹中定义styles.xml。 我使用透明且重叠的ActionBar,当你想隐藏并显示时更好:

    RES / styles.xml

           

    然后在清单中,我在应用程序部分中定义应用程序和ActionBar的样式:

             

    最后在MainActivity中,您必须控制webview中的手势。 您必须实现View.OnTouchListener和Handler.Callback。 当您触摸webview时,您必须比较开始事件和结束事件:

    MainActivity.Java

     public class MainActivity extends Activity implements View.OnTouchListener, Handler.Callback { private float x1,x2,y1,y2; //x1, y1 is the start of the event, x2, y2 is the end. static final int MIN_DISTANCE = 150; //min distance for a scroll up event private static final int CLICK_ON_WEBVIEW = 1; private static final int CLICK_ON_URL = 2; private static final int UP_ON_WEBVIEW = 3; private final Handler handler = new Handler(this); public WebView webView; private WebViewClient client; private WebAppInterface webAppInt = new WebAppInterface(this); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); webView = (WebView)findViewById(R.id.myWebView); webView.setOnTouchListener(this); client = new WebViewClient(); webView.setWebViewClient(client); webView.loadDataWithBaseURL("file:///android_asset/", "myweb.html", "text/html", "UTF-8", ""); } //HERE START THE IMPORTANT PART @Override public boolean onTouch(View v, MotionEvent event) { if (v.getId() == R.id.myWebView && event.getAction() == MotionEvent.ACTION_DOWN){ x1 = event.getX(); y1 = event.getY(); handler.sendEmptyMessageDelayed(CLICK_ON_WEBVIEW, 200); } else if (v.getId() == R.id.myWebView && event.getAction() == MotionEvent.ACTION_UP){ x2 = event.getX(); y2 = event.getY(); handler.sendEmptyMessageDelayed(UP_ON_WEBVIEW, 200); } return false; } @Override public boolean handleMessage(Message msg) { if (msg.what == CLICK_ON_URL){ //if you clic a link in the webview, thats not a scroll handler.removeMessages(CLICK_ON_WEBVIEW); handler.removeMessages(UP_ON_WEBVIEW); return true; } if (msg.what == CLICK_ON_WEBVIEW){ Toast.makeText(this, "WebView clicked", Toast.LENGTH_SHORT).show(); return true; } if (msg.what == UP_ON_WEBVIEW){ float deltaX = x2 - x1; //horizontal move distance float deltaY = y2 - y1; //vertical move distance if ((Math.abs(deltaX) > MIN_DISTANCE) && (Math.abs(deltaX) > Math.abs(deltaY))) { // Left to Right swipe action if (x2 > x1) { Toast.makeText(this, "Left to Right swipe [Next]", Toast.LENGTH_SHORT).show (); } // Right to left swipe action else { Toast.makeText(this, "Right to Left swipe [Previous]", Toast.LENGTH_SHORT).show (); } } else if ((Math.abs(deltaY) > MIN_DISTANCE) && (Math.abs(deltaY) > Math.abs(deltaX))) { // Top to Bottom swipe action -- i SWOW MY ACTIONBAR ON SCROLLDOWN if (y2 > y1) { getActionBar().show(); Toast.makeText(this, "Top to Bottom swipe [Show Bar]", Toast.LENGTH_SHORT).show (); } // Bottom to top swipe action -- I HIDE MY ACTIONBAR ON SCROLLUP else { getActionBar().hide(); Toast.makeText(this, "Bottom to Top swipe [Hide Bar]", Toast.LENGTH_SHORT).show (); } } return true; } return false; } } 

    我希望这能帮到你。

    只需在工具栏或FAB按钮中添加此行即可。

     app:layout_scrollFlags="scroll|enterAlways" 

    app:layout_scrollFlags="scroll|enterAlways"行将导致当用户向下滚动列表时我们的Toolbar将滚动屏幕,一旦他开始向上滚动, Toolbar就会再次显示。 干净简单,这就是CoordinatorLayout的力量!

    敬请关注此链接https://mzgreen.github.io/2015/06/23/How-to-hideshow-Toolbar-when-list-is-scrolling(part3)/&re=1&ts=1453224208&sig=ALL1Aj5aKrtAlylt-Qt3Ci6uwff76BqQYw

    隐藏特定片段的菜单:

      setHasOptionsMenu(true); //Inside of onCreate in FRAGMENT: @Override public void onPrepareOptionsMenu(Menu menu) { menu.findItem(R.id.action_search).setVisible(false); } 

    更改工具栏属性。

    应用:layout_scrollFlags = “滚动| exitUntilCollapsed”