【问题标题】:How to enable back button when CollapsingToolbarLayout is collapsedCollapsingToolbarLayout 折叠时如何启用后退按钮
【发布时间】:2018-01-12 20:35:37
【问题描述】:

我用于折叠工具栏的 xml 代码是,

    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/collapsing_toolbar"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:expandedTitleGravity="left"
        app:expandedTitleMarginTop="-10dp"
        app:expandedTitleMarginStart="10dp"
        app:contentScrim="?attr/colorPrimary"
        app:layout_scrollFlags="scroll|exitUntilCollapsed">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="130dp">

            <ImageView
                android:id="@+id/ivCImage"
                android:layout_width="match_parent"
                android:layout_height="130dp"
                android:scaleType="fitXY"
                android:src="@drawable/image_place_holder" />

        </RelativeLayout>

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_collapseMode="pin">
            </android.support.v7.widget.Toolbar>

    </android.support.design.widget.CollapsingToolbarLayout>

</android.support.design.widget.AppBarLayout>

而我在编码方面所做的是,

private CollapsingToolbarLayout collapsingToolbarLayout = null;

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    ActionBar actionBar = getSupportActionBar();
    actionBar.setDisplayHomeAsUpEnabled(true);

    collapsingToolbarLayout = (CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar);

它始终按应有的方式显示后退图标,但我想在 CollapsingToolbarLayout 折叠时显示/启用主页(后退)图标。我怎样才能做到这一点? 任何帮助/建议将不胜感激。

【问题讨论】:

    标签: android android-toolbar android-collapsingtoolbarlayout android-appbarlayout


    【解决方案1】:

    是的,我很容易做到这一点,您必须在工具栏中简单地启用后退导航,与折叠工具栏无关,并且在清单文件中告诉您的活动它的父类,作为书面父活动名称。

     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        initCollapsingToolbar();
    

    折叠时:

     private void initCollapsingToolbar() {
        final CollapsingToolbarLayout collapsingToolbar =
                (CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar);
        collapsingToolbar.setTitle(" ");
        AppBarLayout appBarLayout = (AppBarLayout) findViewById(R.id.appbar);
        appBarLayout.setExpanded(true);
    
        appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
            boolean isShow = false;
            int scrollRange = -1;
    
            @Override
            public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
                if (scrollRange == -1) {
                    scrollRange = appBarLayout.getTotalScrollRange();
                }
                if (scrollRange + verticalOffset == 0) {
                    collapsingToolbar.setTitle(getString(R.string.Yoga_tips));
                    isShow = true;
                } else if (isShow) {
                    collapsingToolbar.setTitle(" ");
                    isShow = false;
                }
            }
        });
    }
    

    【讨论】:

      【解决方案2】:

      首先创建一个标志

      boolean FLAG_COLLAPSED = true;  //Change this according to your view 
      

      然后给你的 AppBar 添加一个监听器

      AppBarLayout appBarLayout = (AppBarLayout) findViewById(R.id.AppBarLayout);
      appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
          @Override
          public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
              if (Math.abs(verticalOffset) == appBarLayout.getTotalScrollRange()) {
                  // Collapsed
                  FLAG_COLLAPSED = true;
              } else if (verticalOffset == 0) {
                  FLAG_COLLAPSED = false;
              } else {
                  // Somewhere in between
              }
          }
      }););
      

      现在在你的 backpress 方法中,

      @Override
      public void onBackPressed() {
          if(FLAG_COLLAPSED){
              super.onBackPressed();
          }
      }
      

      【讨论】:

      • 我可以根据需要显示图标,但现在的问题是,“collapsingToolbarLayout”标题现在在折叠时显示。