0

I'm using a TranslateAnimation to make a fragment (GoogleMap) sliding down to give space to an EditText and a TextView to be visible. so I used this:

text: TextView

edit: EditText

MapLayout: a LinearLayout that contains the Map

Animation animation = new TranslateAnimation(
MapLayout.getX(), MapLayout.getY(),MapLayout.getY(), text.getHeight()+edit.getHeight());

The problem is that I can't make the slide because text.getHeight()+edit.getHeight() returns 0 so there's no slide! I tried using a number (100 for exemple), the slide is made, but it's different between the devices, I tested on a Galaxy S3 and the slide is not complete, there's still a part of the EditText which is not visible, as for the emulator it worked ok. When I tried to make the number a bit bigger, so the slide will be longer (200 for exemple), well... the slide was good for the S3, but i was big for the emulator.

So what I want to know is that if there's any way to make the slide move to a point, without depending on the device, I mean without using pixels; so the slide will work perfectly in any device/

I hope that my problem is clear. Thank you

Update: I don't if this will help, I added a Toast message, show the height of the EditText and the TextView, in the Emulator it says: 85 and in the S3 it says 181 So yeah, I need to make the map slide down in any device like I said

MainActivity:

protected Animation animation;
    protected LinearLayout MapLayout;
    protected EditText edit;
    protected TextView text;

    MapLayout = (LinearLayout)findViewById(R.id.MapLayout);
    edit = (EditText)findViewById(R.id.Recherche);
    text = (TextView)findViewById(R.id.CaptionRecherche);
    Toast.makeText(context, "Height: "+(edit.getHeight()+text.getHeight()), 1000).show();
    animation = new TranslateAnimation(MapLayout.getX(), MapLayout.getY(), MapLayout.getY(), text.getHeight()+edit.getHeight());
    animation.setDuration(1000);
    animation.setFillAfter(true);
    MapLayout.startAnimation(animation);

Main XML:

------- I'm using a DrawerLayout...I have a slide menu tu show in the application...just for your information-------

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/DrawerLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <include
        android:id="@+id/ContenuPrincipal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        layout="@layout/activity_main_relative"
        />
    <!-- ListView... La liste des options du menu -->
       <ListView
            android:id="@+id/Menu"
            android:layout_width="250dp"
            android:layout_height="fill_parent"
            android:choiceMode="singleChoice"
            android:layout_gravity="start"
            android:background="#333"
            android:divider="#666"
            android:dividerHeight="1dp"
            android:paddingLeft="15dp"
            android:paddingRight="15dp"
            />

</android.support.v4.widget.DrawerLayout>

Main2 XML (The one I included above):

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:background="#E8E8E8">

            <!-- Champs de saisie pour effectuer la recherche:  -->

        <TextView
            android:id="@+id/CaptionRecherche"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Entrer l'emplacement que vous cherchez: "
            android:textSize="20sp"
            android:layout_marginTop="7dp"
            android:layout_marginLeft="20dp"
            />
        <EditText
            android:id="@+id/Recherche"
            android:layout_width="250dp"
            android:layout_height="40dp"
            android:layout_alignParentLeft="true"
            android:layout_marginTop="10dp"
            android:hint="Salle, Deparetement..."
            android:layout_marginLeft="20dp"
            android:layout_marginBottom="20dp"
            android:maxLength="100"
            android:maxLines="1" 
            android:layout_below="@id/CaptionRecherche"/>

                <!-- La map:  -->
     <LinearLayout
         android:id="@+id/MapLayout"
         android:layout_width="fill_parent" 
         android:layout_height="fill_parent"
         >

        <fragment
            android:id="@+id/map"
            android:name="com.google.android.gms.maps.MapFragment"
            android:layout_width="match_parent"
            android:layout_height="fill_parent"
             />

    </LinearLayout>
</RelativeLayout>
JasonMArcher
  • 14,195
  • 22
  • 56
  • 52
Tha.Poox
  • 119
  • 3
  • 12

1 Answers1

0

As a part of my application, I have a status bar which contains some text. This status bar is hidden until the user clicks a button at which point it slides down (hiding the topmost content of the layout below).

The code I use to get the correct height of the hidden status bar:

private int hiddenStatusHeight;
private int currentStatusBarHeight;

private void getStatusBarHeight() {
    final ViewTreeObserver observer = hiddenStatus.getViewTreeObserver();
    observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

        @SuppressLint("NewApi") @SuppressWarnings("deprecation") @Override public void onGlobalLayout() {

            hiddenStatus.measure(MeasureSpec.UNSPECIFIED,
                    MeasureSpec.UNSPECIFIED);
            hiddenStatusHeight = hiddenStatus.getMeasuredHeight();

            currentStatusBarHeight = statusBar.getHeight();

            ViewTreeObserver obs = hiddenStatus.getViewTreeObserver();

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                obs.removeOnGlobalLayoutListener(this);
            } else {
                obs.removeGlobalOnLayoutListener(this);
            }
        }
    });
}

The code that is executed when the button is clicked:

private OnClickListener ExpandClickListener = new OnClickListener() {

    @Override public void onClick(View v) {
        boolean isExpanded = (Boolean) expandButton
                .getTag(R.id.TAG_EXPANDED);
        int originalHeight = (Integer) expandButton
                .getTag(R.id.TAG_ORIGINAL_HEIGHT);

        if (isExpanded) {
            expandButton.setTag(R.id.TAG_EXPANDED, false);
            expandButton.setImageResource(R.drawable.ic_action_down);
            // statusBar.setLayoutParams(new FrameLayout.LayoutParams(
            // LayoutParams.MATCH_PARENT, originalHeight));
            Log.d(TAG, "Collapsing to " + originalHeight);
            ValueAnimator va = ValueAnimator.ofInt(currentStatusBarHeight,
                    originalHeight);
            va.setDuration(500);
            va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                public void onAnimationUpdate(ValueAnimator animation) {
                    Integer value = (Integer) animation.getAnimatedValue();
                    statusBar.getLayoutParams().height = value.intValue();
                    statusBar.requestLayout();
                }
            });
            va.start();
        } else {
            expandButton.setTag(R.id.TAG_EXPANDED, true);
            expandButton.setImageResource(R.drawable.ic_action_collapse);
            currentStatusBarHeight = originalHeight + hiddenStatusHeight;
            // statusBar.setLayoutParams(new FrameLayout.LayoutParams(
            // LayoutParams.MATCH_PARENT, currentStatusBarHeight + 15));
            Log.d(TAG, "Expanding to " + originalHeight + "+"
                    + hiddenStatusHeight + "=" + currentStatusBarHeight);
            ValueAnimator va = ValueAnimator.ofInt(originalHeight,
                    currentStatusBarHeight);
            va.setDuration(500);
            va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                public void onAnimationUpdate(ValueAnimator animation) {
                    Integer value = (Integer) animation.getAnimatedValue();
                    statusBar.getLayoutParams().height = value.intValue();
                    statusBar.requestLayout();
                }
            });
            va.start();
        }

    }
};

And finally my layout XML (it has to be a FrameLayout):

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/frame"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<ScrollView
    android:id="@+id/scrollview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop="70dp" >

    <LinearLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:animateLayoutChanges="true"
        android:orientation="vertical"
        android:paddingLeft="16dp"
        android:paddingRight="16dp"
        android:paddingTop="8dp"
        android:showDividers="middle" >
    </LinearLayout>
</ScrollView>

<RelativeLayout
    android:id="@+id/displayStatusBar"
    style="@style/DisplayStatusBar"
    android:layout_width="match_parent"
    android:layout_height="65dp" >

    <RelativeLayout
        android:id="@+id/status_always_visible"
        style="@style/StatusBar"
        android:layout_width="match_parent"
        android:layout_height="20dp" >

        <TextView
            android:id="@+id/status_received"
            style="@style/StatusBarText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:text="@string/received" />

        <TextView
            android:id="@+id/status_time_received"
            style="@style/StatusBarText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/status_received" />

        <TextView
            android:id="@+id/status_time_delete_relative_text"
            style="@style/StatusBarText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toLeftOf="@+id/status_time_delete_relative"
            android:text="@string/is_deleted" />

        <TextView
            android:id="@+id/status_time_delete_relative"
            style="@style/StatusBarText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:text="@string/minutes" />
    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/status_hidden"
        style="@style/StatusHidden"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/status_always_visible" >

        <LinearLayout
            android:id="@+id/status_hydrants_near_address_container"
            style="@style/StatusHiddenText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_alignParentLeft="true"
            android:divider="@android:drawable/divider_horizontal_bright"
            android:orientation="vertical"
            android:paddingLeft="10dp"
            android:showDividers="middle" >

            <TextView
                style="@style/StatusHiddenText"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/no_information" />
        </LinearLayout>
    </RelativeLayout>

    <LinearLayout
        android:id="@+id/optionsBar"
        android:layout_width="match_parent"
        android:layout_height="45dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:background="#999"
        android:orientation="horizontal"
        android:paddingTop="5dp" >

        <ImageButton
            android:id="@+id/button_hydrants"
            style="@style/android:Widget.ImageButton"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:alpha="50"
            android:contentDescription="@string/module_hydrants"
            android:src="@drawable/ic_action_place" />

        <ImageButton
            android:id="@+id/button_route"
            style="@style/android:Widget.ImageButton"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:contentDescription="@string/module_directions"
            android:src="@drawable/ic_action_directions" />

        <ImageButton
            android:id="@+id/button_pdf"
            style="@style/android:Widget.ImageButton"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:clickable="false"
            android:contentDescription="@string/module_accessplan"
            android:src="@drawable/ic_action_attachment" />

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent" >

            <ImageButton
                android:id="@+id/button_more"
                style="@style/android:Widget.ImageButton"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_alignParentTop="true"
                android:src="@drawable/ic_action_down" />

        </RelativeLayout>
    </LinearLayout>
</RelativeLayout>

<!-- The "empty" view to show when there are no items in the "list" view defined above. -->

<TextView
    android:id="@android:id/empty"
    style="?android:textAppearanceSmall"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:padding="32dp"
    android:text="@string/no_information"
    android:textColor="?android:textColorSecondary" />

</FrameLayout>

Hope some of this may be helpful to you.

Just to mention it, I have asked a similar question where the visible layout is pushed downwards as the menu expands. So have a look at that if you rather want this behaviour: How to animate a slide in notification view that pushes the content view down

Happy coding

Community
  • 1
  • 1
cYrixmorten
  • 7,110
  • 3
  • 25
  • 33