检测AppBarLayout / CollapsingToolbarLayout何时完全展开

时间:2015-08-25 20:48:49

标签: android android-coordinatorlayout android-collapsingtoolbarlayout android-appbarlayout

我有一个使用新的CoordinatorLayout / AppBarLayout / CollapsingToolbarLayout范例的片段,我希望能够检测到折叠工具栏何时完全展开,以便我可以对其所在的整个片段执行操作,例如:从片组中弹出片段并转到新片段,解散片段。我有解雇代码工作,我只需知道何时何时不使用它。

我用AppBarLayout.OnOffsetChangedListener进行了一些实验,但没有太多运气。有没有办法用它来确定什么时候完全展开,或者是否有人知道更优选的方法?

提前致谢!

编辑: 我也看到AppBarLayout.setExpanded(...)有几个实现,但不是AppBarLayout.getExpanded()或者类似的东西,所以我也很难过。

3 个答案:

答案 0 :(得分:36)

它看起来并不像API中的任何内容,但以下似乎对我有用。它可能需要测试。

boolean fullyExpanded =
    (appBarLayout.getHeight() - appBarLayout.getBottom()) == 0;

编辑:上面的解决方案确实有效,但由于我想在滚动appbar时测试这种情况,我最终使用OnOffsetChangedListener的以下解决方案。

class Frag extends Fragment implements AppBarLayout.OnOffsetChangedListener {

    private boolean appBarIsExpanded = true;
    private AppBarLayout appBarLayout;

    @Override 
    public void onActivityCreated(Bundle state) {
        super.onActivityCreated(state);
        appBarLayout = (AppBarLayout) getActivity().findViewById(R.id.app_bar);
    }

    @Override
    public void onResume() {
        super.onResume();
        appBarLayout.addOnOffsetChangedListener(this);
    }

    @Override
    public void onStop() {
        super.onStop();
        appBarLayout.removeOnOffsetChangedListener(this);
    }

    @Override
    public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
        appBarIsExpanded = (verticalOffset == 0);
    } 

}

答案 1 :(得分:7)

我的解决方案基于创建自定义视图。首先创建一个扩展本机AppBarLayout的类:

public class CustomAppBar extends AppBarLayout { ....

然后在类中设置一个addOnOffsetChangedListener,如下所示:

this.addOnOffsetChangedListener...

您可以通过在构造函数中设置或者通过调用构造函数内的方法来执行上述操作。所以你需要构造函数,记得使用带有2个参数的构造函数来添加到xml

public CustomAppBar(Context context, AttributeSet attrs) {
        super(context, attrs);
//You can set the listener here or maybe call the method that set the listener
}

然后我们必须访问视图的状态,因此在自定义视图类中创建一个私有布尔值,如果视图开始展开或折叠,则将其设置为true或false,在这种情况下,我的视图默认为扩展:

private boolean isExpanded = true;

现在你必须更新该布尔值的状态:

this.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
            @Override
            public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
                if (verticalOffset == 0) {
                    isExpanded = true;
                } else {
                    isExpanded = false;
                }
            }
        });

下一步是通过在CustomAppBar类中使用getter来获取布尔值的状态

public boolean isExpanded() {
        return isExpanded;
    }

接下来是转到你的xml,在那里使用你的自定义视图,然后在Acivity或Fragment中获取视图并使用该方法来了解AppBar状态

答案 2 :(得分:4)

我知道,这可能有点晚了,但是我发现,我发现AppBArLayout的源代码, AppBarLayout.OnOffsetChangedListener 只是转换了 int getTopAndBottomOffset()的值的AppBar行为。

因此,您可以随时使用此代码来定义AppBarLayout是否扩展:

public boolean isAppBArExpanded(AppBarLayout abl) {
    final CoordinatorLayout.Behavior behavior = ((CoordinatorLayout.LayoutParams) abl.getLayoutParams()).getBehavior();
    return (behavior instanceof AppBarLayout.Behavior) ? (((AppBarLayout.Behavior) behavior).getTopAndBottomOffset() == 0) : false;
}