23

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

我已经用AppBarLayout.OnOffsetChangedListener做了一些实验进行了一些实验,但运气不佳。有没有办法用它来确定事情何时完全扩展,或者有没有人知道的更喜欢的方法?

提前致谢!

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

4

3 回答 3

47

API 中似乎没有任何内容,但以下内容似乎对我有用。它可能需要测试。

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

编辑:上面的解决方案似乎确实有效,但是由于我想在滚动应用栏时测试这种情况,所以我最终使用了以下解决方案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);
    } 

}
于 2015-09-23T13:29:07.750 回答
9

我的解决方案基于创建自定义视图。首先创建一个扩展原生 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,在那里使用您的自定义视图,然后在活动或片段中获取视图并使用该方法来了解 AppBar 状态

于 2016-06-17T16:59:52.163 回答
7

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

因此,您可以随时使用此代码来定义 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;
}
于 2017-11-22T13:22:13.173 回答