Chỉ hiển thị tiêu đề CollapsingToolbarLayout khi được thu gọn


145

Tôi đã thử setExpandedTitleColorsetCollapsedTitleColor(chuyển sang và từ trong suốt) không có may mắn. Tôi cũng không thể thấy bất kỳ phương pháp được xây dựng nào sẽ thực hiện những gì tôi đang tìm kiếm.

Tôi chỉ muốn hiển thị tiêu đề khi CollapsingToolbarLayout bị sập hoàn toàn, nếu không, tôi cần ẩn nó.

Có gợi ý nào không?

Câu trả lời:


285

Bạn có thể thêm OnOffsetChangedListenervào AppBarLayoutđể xác định thời điểm thu CollapsingToolbarLayoutgọn hoặc mở rộng và đặt tiêu đề.

Java

final CollapsingToolbarLayout collapsingToolbarLayout = (CollapsingToolbarLayout) findViewById(R.id.collapsingToolbarLayout);
AppBarLayout appBarLayout = (AppBarLayout) findViewById(R.id.appBarLayout);
appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
    boolean isShow = true;
    int scrollRange = -1;

    @Override
    public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
        if (scrollRange == -1) {
            scrollRange = appBarLayout.getTotalScrollRange();
        }
        if (scrollRange + verticalOffset == 0) {
            collapsingToolbarLayout.setTitle("Title");
            isShow = true;
        } else if(isShow) {
            collapsingToolbarLayout.setTitle(" ");//careful there should a space between double quote otherwise it wont work 
            isShow = false;
        }
    }
});

Kotlin

var isShow = true
var scrollRange = -1
appBarLayout.addOnOffsetChangedListener(AppBarLayout.OnOffsetChangedListener { barLayout, verticalOffset ->
    if (scrollRange == -1){
        scrollRange = barLayout?.totalScrollRange!!
    }
    if (scrollRange + verticalOffset == 0){
        collapsingToolbarLayout.title = "Title Collapse"
        isShow = true
    } else if (isShow){
        collapsingToolbarLayout.title = " " //careful there should a space between double quote otherwise it wont work
        isShow = false
    }
})

1
Giải pháp này hoạt động cho api 23 trở lên. Đây là giải pháp chính xác nhất.
Simon

Vui lòng đánh dấu đây là câu trả lời đúng. Câu trả lời từ @dlohani hiện được đánh dấu là chính xác không ẩn văn bản vì bạn có thể thấy nó chuyển tiếp.
themichaelscott

9
Nó hoạt động với tôi, nhưng phải thay đổi "boolean isShow = false" thành true để xóa tên ứng dụng trong thanh công cụ mở rộng khi bắt đầu hoạt động.
DH28

3
@Giuseppe: nó giống nhau. Đã thử nghiệm trên API 16 -> đang hoạt động
luckyhandler

1
Điều này không phù hợp với tôi, đôi khi tiêu đề hoàn toàn không xuất hiện ngay cả khi nhật ký của tôi nêu rõ rằng setTitle được gọi với "Tiêu đề"
user1354603

47

Tôi đã thử giải pháp của dlohani, nhưng không thích vì nó mờ dần. Với giải pháp này, bạn loại bỏ hoàn toàn mờ dần.

Mẹo nhỏ là tạo một kiểu mới với textSize bằng 0,1sp hoặc 0sp (cái này gặp sự cố trên SDK <19) và textColor trong suốt:

Đối với SDK <19

<style name="CollapsingToolbarLayoutExpandedTextStyle" parent="AppTheme">
    <item name="android:textColor">@android:color/transparent</item>
    <item name="android:textSize">0.1sp</item>
</style>

Đối với SDK> = 19

<style name="CollapsingToolbarLayoutExpandedTextStyle" parent="AppTheme">
    <item name="android:textColor">@android:color/transparent</item>
    <item name="android:textSize">0sp</item>
</style>

Sau đó áp dụng nó cho CollapsingToolbarLayout trong bố cục của bạn:

    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/collapsing_toolbar"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:expandedTitleTextAppearance="@style/CollapsingToolbarLayoutExpandedTextStyle"
        app:layout_scrollFlags="scroll|exitUntilCollapsed">

Ok, như mọi khi, đây là một giải pháp khác không hoạt động giống nhau cho tất cả các thiết bị. Trên Kitkat 0sp dường như hoạt động, nhưng trên Jellybean, nó làm cho ứng dụng bị sập. 0,1sp hoạt động trên Jellybean nhưng làm cho văn bản bị rung trên Kitkat :(
Rúben Sousa

Làm thế nào chúng ta có thể thiết lập giới hạn cấp độ api trên phong cách?
Mahm00d

Bạn cần sử dụng thư mục value-v19 cho SDK> = 19 và thư mục giá trị cho SDK <19. Hãy xem phần này để tham khảo: stackoverflow.com/questions/16624317/
Rúben Sousa

1
Điều này hoạt động trên N trong khi giải pháp từ @dlohani thì không
Tyler Pfaff

1
Đây là giải pháp đơn giản và tốt nhất. Cảm ơn bạn rất nhiều.
Vikash Parajuli

38

Tôi đã có thể có được hiệu ứng mong muốn bằng cách thêm thuộc tính sau vào bố cục xml:

app:expandedTitleTextAppearance="@android:color/transparent"

vì vậy CollapsingToolbarLayout của tôi trông như thế này

<android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/collapsingToolbarLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:expandedTitleTextAppearance="@android:color/transparent"
        app:layout_scrollFlags="scroll|exitUntilCollapsed">

Đây là tuyệt vời :) có bất kỳ wey cho tiêu đề để đưa ra một số hoạt hình?
Lubos Mudrak

7
Điều này thật kinh khủng, bạn thấy nó mờ dần khi nó sụp đổ. Thay vào đó nó chỉ mờ dần ở vị trí cuối cùng của nó.
CaptRisky

1
Ditto những gì CaptRisky nói. Thật không may, tôi không nghĩ rằng có một sự thay thế :-(
kenyee

9
Điều này sẽ chỉ hoạt động nếu bạn đang sử dụng Android api 22 trở xuống. Từ 23 trở lên, giải pháp không hoạt động. Bạn sẽ phải sử dụng giải pháp từ @ steven274.
Simon

1
Nó hoạt động thậm chí còn tốt hơn trong khi trên Android api 23 khi tôi thử
dlohani

24

Tôi có một câu trả lời đơn giản hơn:

final CollapsingToolbarLayout collapsingToolbarLayout = (CollapsingToolbarLayout) findViewById(R.id.toolbar_layout);

collapsingToolbarLayout.setTitle("Your Title");
collapsingToolbarLayout.setExpandedTitleColor(getResources().getColor(R.color.transperent)); // transperent color = #00000000
collapsingToolbarLayout.setCollapsedTitleTextColor(Color.rgb(0, 0, 0)); //Color of your title

Chúc mừng mã hóa!


4
Điều này gây ra sự mờ dần tương tự trong vấn đề như được tham chiếu trong các câu trả lời khác.
themichaelscott

Tôi chỉ muốn thay đổi màu tiêu đề của Thanh công cụ và nó hoạt động với tôimCollapsingToolbarLayout.setExpandedTitleColor(Color.argb(255,0,0,0))
kosiara - Bartosz Kosarzycki 17/03/2016

@Bartosz Kosarzycki, tôi đã không may mắn với mCollapsingToolbarLayout.setExpandedTitleColor (Color.argb (255,0,0,0)); nhưng mCollapsingToolbarLayout.setExpandedTitleColor (bối cảnh.getResource (). getColor (android.R.color.transparent)); đã làm công việc đó, nhưng chắc chắn xuất phát từ giải pháp của bạn :)
ShayHaned

24

Mã này hoạt động với tôi: Sử dụng màu color.parse vì nếu màu nền của bạn khác thì thay thế bằng màu trắng và tiêu đề của bạn không hiển thị

collapsingToolbarLayout.setExpandedTitleColor(Color.parseColor("#00FFFFFF"));

Hoặc bạn có thể sử dụng cho minh bạch collapsingToolbarLayout.setExpandedTitleColor(Color.TRANSPARENT);


Không có người nghe thêm làm việc như mong đợi!
Mrityunjay Kumar

19

Tôi đã thêm thành công một chế độ xem văn bản mờ dần, chỉ cần thêm chế độ xem văn bản trên thanh công cụ và đặt alpha ở chế độ dọc theo gói dọc trong cuộc gọi lại trên thanh ứng dụng

mAppBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {

        @Override
        public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {

            mTitleTextView.setAlpha(Math.abs(verticalOffset / (float)
                    appBarLayout.getTotalScrollRange()));
        }
    });

float phạm vi = appBarLayout.getTotalScrollRange (); float alpha = Math.abs (vertical Offerset / Range); if (alpha> 0.8) {mToolbar.setAlpha (alpha); } khác {mToolbar.setAlpha (.0f); }
qinmiao

13

Đây là giải pháp đơn giản và hiệu quả nhất với api 23:

ứng dụng: extendTitleTextAppparent phải kế thừa TextAppparent.

Vì vậy, trong tệp style.xml của bạn, hãy thêm các hàng này:

<style name="TransparentText" parent="@android:style/TextAppearance">
   <item name="android:textColor">#00000000</item>
</style>

Sau đó, trong CollapsingToolbarLayout của bạn, hãy thêm hàng này.

app:expandedTitleTextAppearance="@style/TransparentText"

Đó là tất cả mọi người!


5

Các giải pháp dưới đây hoạt động hoàn hảo.

appbar.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
                @Override
                public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
                    if (Math.abs(verticalOffset)-appBarLayout.getTotalScrollRange() == 0)
                    {
                        // Collapsed
                        setTitle("Title To Show");
                    }
                    else
                    {
                        // Expanded
                        setTitle("");
                    }
                }
            });

4

Đây là giải pháp của tôi:

collapsingToolbar.setCollapsedTitleTextAppearance(R.style.personal_collapsed_title);
collapsingToolbar.setExpandedTitleTextAppearance(R.style.personal_expanded_title);

<style name="personal_collapsed_title">
     <item name="android:textSize">18sp</item>
     <item name="android:textColor">@color/black</item>
</style>

<style name="personal_expanded_title">
     <item name="android:textSize">0sp</item>
</style>

2

Theo ý kiến ​​của tôi, một giải pháp thanh lịch hơn một chút sẽ là như thế này.

public class MyCollapsingToolbarLayout extends CollapsingToolbarLayout {

    private final int toolbarId;
    @Nullable private Toolbar toolbar;

    public MyCollapsingToolbarLayout(Context context, AttributeSet attrs) {
        super(context, attrs);

        setTitleEnabled(false);

        TypedArray a = context.obtainStyledAttributes(attrs,
                R.styleable.CollapsingToolbarLayout, 0,
                R.style.Widget_Design_CollapsingToolbar);

        toolbarId = a.getResourceId(android.support.design.R.styleable.CollapsingToolbarLayout_toolbarId, -1);

        a.recycle();

    }

    @Override public void setScrimsShown(boolean shown, boolean animate) {
        super.setScrimsShown(shown, animate);

        findToolbar();
        if (toolbar != null) {
            toolbar.setTitleTextColor(shown ? Color.WHITE : Color.TRANSPARENT);
        }
    }

    private void findToolbar() {
        if (toolbar == null) {
            toolbar = (Toolbar) findViewById(toolbarId);
        }
    }

}

Và việc sử dụng sẽ trông giống như thế này

<butter.droid.widget.BurtterCollapsingToolbarLayout
        app:toolbarId="@+id/toolbar"
        ...>

Ngoài ra còn có khả năng làm mờ dần / trong văn bản thay vì chỉ hiển thị hoặc ẩn nó.


2

Điều này làm việc cho tôi.

final Toolbar tool = (Toolbar)findViewById(R.id.toolbar);
CollapsingToolbarLayout c = (CollapsingToolbarLayout)findViewById(R.id.collapsing_toolbar);
AppBarLayout appbar = (AppBarLayout)findViewById(R.id.app_bar_layout);
tool.setTitle("");
setSupportActionBar(tool);
c.setTitleEnabled(false);

appbar.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
    boolean isVisible = true;
    int scrollRange = -1;
    @Override
    public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
        if (scrollRange == -1) {
            scrollRange = appBarLayout.getTotalScrollRange();
        }
        if (scrollRange + verticalOffset == 0) {
           tool.setTitle("Title");
            isVisible = true;
        } else if(isVisible) {
            tool.setTitle("");
            isVisible = false;
        }
    }
});

0

Đây là phiên bản kotlin phù hợp với tôi:

appbar.addOnOffsetChangedListener(object : OnOffsetChangedListener {
                var isShow = true
                var scrollRange = -1
                override fun onOffsetChanged(appBarLayout: AppBarLayout, verticalOffset: Int) {
                    if (scrollRange == -1) scrollRange = appBarLayout.totalScrollRange

                    if (scrollRange + verticalOffset == 0) {
                        toolbarLayout.title = "Title"
                        isShow = true
                    } else if (isShow) {
                        toolbarLayout.title = " " //These quote " " with _ space is intended 
                        isShow = false
                    }
                }
            })

0

chỉ cần thêm mã này:

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

collapsingToolbarLayout.setExpandedTitleColor(ContextCompat.getColor(this , android.R.color.transparent));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.