Mostrar el título CollapsingToolbarLayout solo cuando está contraído

145

He intentado setExpandedTitleColory setCollapsedTitleColor(cambiando hacia y desde transparente) sin suerte. Tampoco puedo ver ningún método integrado que haga lo que estoy buscando.

Solo quiero mostrar el título cuando CollapsingToolbarLayout está completamente contraído, de lo contrario, lo necesito oculto.

¿Alguna pista?

Psest328
fuente

Respuestas:

285

Puede agregar OnOffsetChangedListenera AppBarLayoutpara determinar cuándo CollapsingToolbarLayoutse contrae o expande y establecer su título.

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
    }
})
steven274
fuente
1
Esta solución funciona para la API 23 y superior. Esta es la solución más correcta.
Simon
Por favor marque esto como la respuesta correcta. La respuesta de @dlohani que actualmente está marcada como correcta no oculta el texto porque puede ver la transición.
themichaelscott
9
Funcionó para mí, pero tuve que cambiar "boolean isShow = false" a verdadero para eliminar el nombre de la aplicación en la barra de herramientas expandida al inicio de la actividad.
DH28
3
@Giuseppe: es lo mismo. Probado en API 16 -> trabajando
luckyhandler
1
Esto no funcionó para mí, a veces el título no aparece en absoluto, incluso cuando mis registros indican claramente que setTitle fue llamado con "Título"
usuario1354603
47

Probé la solución de dlohani, pero no me gustó por la desaparición. Con esta solución, eliminas el desvanecimiento por completo.

El truco consiste en crear un nuevo estilo con textSize igual a 0.1sp o 0sp (este se bloquea en SDK <19) y textColor transparent:

Para SDK <19

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

Para SDK> = 19

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

Luego aplíquelo a CollapsingToolbarLayout en su diseño:

    <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">
Rúben Sousa
fuente
Ok, como siempre, esta es otra solución que no funciona igual para todos los dispositivos. En Kitkat 0sp parece funcionar, pero en Jellybean hace que la aplicación se bloquee. 0.1sp funciona en Jellybean pero hace que el texto sea inestable en Kitkat :(
Rúben Sousa
¿Cómo podemos establecer ese límite de nivel de API en el estilo?
Mahm00d
Debe usar la carpeta values-v19 para SDK> = 19 y la carpeta de valores para SDK <19. Mire esto como referencia: stackoverflow.com/questions/16624317/…
Rúben Sousa
1
Esto funciona en N, mientras que la solución de @dlohani no lo hizo
Tyler Pfaff
1
Esta es la mejor y más simple solución. Muchas gracias.
Vikash Parajuli
38

Pude obtener el efecto deseado al agregar la siguiente propiedad al diseño xml:

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

entonces mi CollapsingToolbarLayout se ve así

<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">
dlohani
fuente
esto es increíble :) ¿hay algún beneficio para que el título tenga alguna animación?
Lubos Mudrak
77
Esto es horrible, lo ves desvanecerse cuando se derrumba. Más bien simplemente se desvanece en su posición final.
CaptRisky
1
Lo mismo dice CaptRisky. Desafortunadamente, no creo que haya una alternativa :-(
kenyee
9
Esto solo funcionará si está utilizando la API de Android 22 o inferior. Para 23 o superior, la solución no funciona. Deberá utilizar la solución de @ steven274.
Simon
1
Funcionó aún mejor mientras estaba en la api 23 de Android cuando lo intenté
dlohani
24

Tengo una respuesta más simple:

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

¡Feliz codificación!

Shrini Jaiswal
fuente
44
Esto causa el mismo desvanecimiento en cuestión como se menciona en otras respuestas.
themichaelscott
Solo quería cambiar el color del título de la barra mCollapsingToolbarLayout.setExpandedTitleColor(Color.argb(255,0,0,0))
Google
@Bartosz Kosarzycki, tuve mala suerte con mCollapsingToolbarLayout.setExpandedTitleColor (Color.argb (255,0,0,0)); pero mCollapsingToolbarLayout.setExpandedTitleColor (context.getResources (). getColor (android.R.color.transparent)); hizo el trabajo, pero ciertamente se deriva de su solución :)
ShayHaned
24

Este código funciona para mí: use color.parse color porque si el color de fondo es diferente, reemplácelo con blanco y su título no se mostrará

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

O puedes usar para transparente collapsingToolbarLayout.setExpandedTitleColor(Color.TRANSPARENT);

Hardik Dudhaiya
fuente
¡No hay oyentes adicionales que trabajen como se esperaba!
Mrityunjay Kumar
19

Agregué con éxito una vista de texto que se desvanece, simplemente agregue una vista de texto en la barra de herramientas y configuré su alfa en función de la vertical Offset en la devolución de llamada de la barra de aplicaciones

mAppBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {

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

            mTitleTextView.setAlpha(Math.abs(verticalOffset / (float)
                    appBarLayout.getTotalScrollRange()));
        }
    });
Vishal
fuente
rango flotante = appBarLayout.getTotalScrollRange (); flotante alfa = Math.abs (verticalOffset / range); if (alfa> 0.8) {mToolbar.setAlpha (alfa); } else {mToolbar.setAlpha (.0f); }
qinmiao
13

Aquí la solución más simple y funcional también con api 23:

aplicación: extendedTitleTextAppearance tiene que heredar TextAppearance.

Entonces, en su styles.xml agregue estas filas:

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

Luego, en su CollapsingToolbarLayout, agregue esta fila.

app:expandedTitleTextAppearance="@style/TransparentText"

¡Eso es todo amigos!

Alecs
fuente
5

La siguiente solución funciona perfectamente.

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("");
                    }
                }
            });
Parth Patel
fuente
4

Aquí está mi solución:

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>
Shaun
fuente
2

En mi opinión, una solución un poco más elegante sería algo como esto.

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

}

Y el uso se vería así

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

También existe la posibilidad de desvanecer / introducir texto en lugar de solo mostrarlo u ocultarlo.

Blaz
fuente
2

Esto funciona para mi.

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;
        }
    }
});
Aistis
fuente
0

Esta es la versión de Kotlin que funciona para mí:

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
                    }
                }
            })
realpranav
fuente
0

solo agrega este código:

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

collapsingToolbarLayout.setExpandedTitleColor(ContextCompat.getColor(this , android.R.color.transparent));
AlimItTech
fuente