2
respostas

getMeasureHeight retornando um valor muito grande(16777214)

Olá, A activite principal do meu app consiste de uma linearlayout(vertical) com diversos Fragments que podem ser retraídos ou expandidos de acordo com as minhas funções expand e collapse. Essas funções usam o o getMeasureHeight() da view para saber o quanto esse fragment tem que ser expandido ou retraído. Isso funciona para quase todos os Fragments, exceto por um que expande para uma altura muito grande, eu vi que que isso é por causa da getMeasureHeight estar retornando um valor muito grande(16777214). Acho que é bom dizer também que esse é o único Fragment que usa uma ListView, apesar de sempre exibir o mesmo número de itens.

Alguém saberia o porque desse retorno tão grande? Segue o xml do Fragment e as funções expand e collapse:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:app="http://schemas.android.com/apk/res-auto"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                xmlns:tools="http://schemas.android.com/tools"
                android:orientation="vertical"
                android:background="@drawable/layout_border">

    <TextView/>

    <ImageButton/>

    <RelativeLayout
        android:id="@+id/mission_history_relativelayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_below="@+id/mission_history_title_textview"
        android:background="@drawable/fragment_border"
        android:visibility="gone">

        <ImageButton/>

        <ImageButton/>

        <ImageButton/>

           <ListView
            android:id="@+id/mission_history_listview"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_above="@id/mission_history_export_text_button"
            android:layout_alignParentStart="true"
            android:layout_alignParentTop="true"
            android:background="@color/bg_transparent"
            tools:listheader="@layout/mission_history_header"
            tools:listitem="@layout/listview_mission_history"
            android:clickable="false"/>

    </RelativeLayout>

</RelativeLayout>
2 respostas
public static void expand( final View v )
    {
        v.measure( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT );
        final int targetHeight = v.getMeasuredHeight();
        Log.i(TAG, "InitialHeight: " + targetHeight);
        v.getLayoutParams().height = 0;
        v.setVisibility( View.VISIBLE );
        final Animation animation = new Animation()
        {
            @Override
            protected void applyTransformation( final float interpolatedTime,
                    final Transformation t )
            {
                final BigDecimal interpolatedTimeToUse = BigDecimal.valueOf( interpolatedTime );
                v.getLayoutParams().height = interpolatedTimeToUse == BigDecimal.valueOf( 1 )
                        ? ViewGroup.LayoutParams.WRAP_CONTENT
                        : ( int ) ( targetHeight * interpolatedTime );
                v.requestLayout();
            }

            @Override
            public boolean willChangeBounds()
            {
                return true;
            }
        };

        animation.setDuration( ( int ) ( targetHeight
                / v.getContext().getResources().getDisplayMetrics().density ) );
        v.startAnimation( animation );
    }

    public static void collapse( final View v )
    {
        final int initialHeight = v.getMeasuredHeight();

        final Animation animation = new Animation()
        {
            @Override
            protected void applyTransformation( final float interpolatedTime,
                    final Transformation t )
            {
                final BigDecimal interpolatedTimeToUse = BigDecimal.valueOf( interpolatedTime );
                if ( interpolatedTimeToUse == BigDecimal.valueOf( 1 ) )
                {
                    v.setVisibility( View.GONE );
                } else
                {
                    v.getLayoutParams().height =
                            initialHeight - ( int ) ( initialHeight * interpolatedTime );
                    v.requestLayout();
                }
            }

            @Override
            public boolean willChangeBounds()
            {
                return true;
            }
        };

        animation.setDuration( ( int ) ( initialHeight
                / v.getContext().getResources().getDisplayMetrics().density ) );
        v.startAnimation( animation );
    }

Geralmente, o getMesureHeight considera o tamanho total da ListView (ou de qualquer componente com ScrollView) e não o tamanho da tela. Uma sugestão seria guardar esse height previamente calculado e usá-lo quando precisar nesse fragment que possui a lista.