如何从Android支持库锁定CollapsingToolbarLayout

时间:2016-01-06 14:27:04

标签: android android-fragments android-fragmentactivity android-collapsingtoolbarlayout

我使用Activity类(通常)一个片段作为内容。在活动中,我使用CollapsingToolbarLayout作为某种信息的某种标题,一切正常。但在某些情况下(当附加一些片段时)我不想显示该信息,我不想在滚动时打开CollapsingToolbarLayout

我想要实现的是锁定appBarLayout.setExpanded(false, true);,防止它从片段中打开。我正在使用public class Homepage extends FragmentActivity implements ChatFragment.OnFragmentInteractionListener{ SearchFragment searchFragment; ChatFragment chatFragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_homepage); searchFragment = new SearchFragment(); chatFragment = new ChatFragment(); if(savedInstanceState == null){ getFragmentManager().beginTransaction().replace(R.id.homepageFragment,chatFragment).commit(); } } @Override protected void onResume(){ Bundle bundle = getIntent().getExtras(); if(bundle != null){ //text.setText("user_id: " + bundle.get("user_id") + " ,username: " + bundle.get("username") + " ,password: " + bundle.get("password")); } super.onResume(); } @Override public void onChatFragmentInteraction(Uri uri){ } public void openSearchFragment(View view){ if(!searchFragment.isAdded()) getFragmentManager().beginTransaction().replace(R.id.homepageFragment,searchFragment).commit(); } public void openChatFragment(View view){ if(!chatFragment.isAdded()) getFragmentManager().beginTransaction().replace(R.id.homepageFragment,chatFragment).commit(); } public void openProfile(View view){ } }

以编程方式将其折叠起来

2 个答案:

答案 0 :(得分:4)

我想出了一个不同的方法,因为设置嵌套滚动标志仅在拖动NestedScrollView时有效。仍然可以通过滑动栏本身来扩展appbar。

我将其设置为“Utils”类中的静态函数。显然,您在解锁时设置的标志将取决于哪些与您的用例相关。

此功能假设您从扩展工具栏开始

public static void LockToolbar(boolean locked, final AppBarLayout appbar, final CollapsingToolbarLayout toolbar) {

    if (locked) {
        // We want to lock so add the listener and collapse the toolbar
        appbar.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {

            @Override
            public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
                if (toolbar.getHeight() + verticalOffset < 2 * ViewCompat.getMinimumHeight(toolbar)) {
                    // Now fully expanded again so remove the listener
                    appbar.removeOnOffsetChangedListener(this);
                } else {
                    // Fully collapsed so set the flags to lock the toolbar
                    AppBarLayout.LayoutParams lp = (AppBarLayout.LayoutParams) toolbar.getLayoutParams();
                    lp.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED);
                }
            }
        });
        appbar.setExpanded(false, true);
    } else {
        // Unlock by restoring the flags and then expand 
        AppBarLayout.LayoutParams lp = (AppBarLayout.LayoutParams) toolbar.getLayoutParams();
        lp.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL | AppBarLayout.LayoutParams.SCROLL_FLAG_EXIT_UNTIL_COLLAPSED);
        appbar.setExpanded(true, true);
    }

}

答案 1 :(得分:3)

好吧,我自己设法解决了。诀窍是使用ViewCompat.setNestedScrollingEnabled(recyclerView, expanded);

禁用嵌套滚动行为

由于我在活动中使用一个片段作为内容视图并将其放在backstack上,我只需检查后台堆栈何时发生变化以及哪个片段是可见的。请注意,我在每个片段中使用NestedScrollView来触发可折叠工具栏。这是我的代码:

getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            NestedScrollView nestedScrollView = (NestedScrollView)findViewById(R.id.nested_scroll_view);
            int size = getSupportFragmentManager().getBackStackEntryCount();
            if (size >= 1 && nestedScrollView != null) {
                if (getSupportFragmentManager().getBackStackEntryAt(size - 1).getName().equals("SpotDetailsFragment")) {
                    Log.d(LOG_TAG, "Enabling collapsible toolbar.");
                    ViewCompat.setNestedScrollingEnabled(nestedScrollView, true);
                } else {
                    Log.d(LOG_TAG, "Disabling collapsible toolbar.");
                    ViewCompat.setNestedScrollingEnabled(nestedScrollView, false);
                }
            }
        }
    });

这个帖子给了我很多帮助,其中提供了另一种可能的解决方案: Need to disable expand on CollapsingToolbarLayout for certain fragments