Android 检测AppBarLayout/CollingToolBarLayout何时完全展开

Android 检测AppBarLayout/CollingToolBarLayout何时完全展开,android,android-coordinatorlayout,android-collapsingtoolbarlayout,android-appbarlayout,Android,Android Coordinatorlayout,Android Collapsingtoolbarlayout,Android Appbarlayout,我有一个片段,它使用了新的CoordinatorLayout/AppBarLayout/CollasingToolbarLayout范例,我希望能够检测到折叠工具栏何时完全展开,这样我就可以对它所在的整个片段执行操作,例如,将片段从堆栈中弹出并转到一个新的片段,然后丢弃该片段。我有解雇代码工作,我只需要知道什么时候和什么时候不使用它 我试过一点,但运气不太好。有没有一种方法可以用它来确定什么时候事情被完全扩展,或者有没有一种人们更喜欢的方法 提前谢谢 编辑: 我还看到有几个实现,但不是AppBa

我有一个片段,它使用了新的CoordinatorLayout/AppBarLayout/CollasingToolbarLayout范例,我希望能够检测到折叠工具栏何时完全展开,这样我就可以对它所在的整个片段执行操作,例如,将片段从堆栈中弹出并转到一个新的片段,然后丢弃该片段。我有解雇代码工作,我只需要知道什么时候和什么时候不使用它

我试过一点,但运气不太好。有没有一种方法可以用它来确定什么时候事情被完全扩展,或者有没有一种人们更喜欢的方法

提前谢谢

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

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);
    } 

}

我的解决方案基于创建自定义视图。首先创建一个扩展本机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状态

我知道,这可能有点晚,但正在探索我找到的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;
}

也许appBarLayout.addOnOffsetChangedListener能帮上忙,但我发现它有问题,可能是因为我没有正确地实现它。你找到解决方案了吗?当工具栏部分折叠时,我在试图阻止ScrollRefreshLayout刷新时遇到了同样的问题。我最终放弃了当初为什么要这样做的概念,但我接受你的答案,因为你说它对你有用。谢谢这对我也不管用。添加了接口的实现,但似乎没有得到called@user1232726您需要将侦听器附加到AppBarLayout。我用一种方法更新了代码。如果您不关心潜在的泄漏,只需使用
appBarLayout.setOnScrollChangeListener(此)
即可。您刚刚救了我一天。谢谢。如果您只需将一个
OnOffsetChangedListener
直接添加到
AppBarLayout
实例中,这似乎有点过分了。如果您只想使用该AppBarLayout一次:是的。但是如果不止一个活动需要知道AppBarLayout状态,那么:这是一个干解决方案