kramer65
kramer65

Reputation: 53943

How to hide Android LinearLayout in onCreate?

I've got an Android Switch which when turned on, expands a LinearLayout below it. For this I use an animation. When I start the screen the button is turned off, but the LinearLayout is shown. When I now turn the Switch to on, and then back off again, it indeed hides the LinearLayout, but like I said, whenever the screen starts, the LinearLayout is shown by default. Does anybody know how I can hide the LinearLayout by default when the screen starts?

The code I have now is as follows:

public class MyClass extends Activity implements OnCheckedChangeListener {
    Switch mySwitch;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_layout);

        mySwitch = (Switch) findViewById(R.id.my_switch);
        mySwitch.setOnCheckedChangeListener(this);
    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked){
            LinearLayout view = (LinearLayout) findViewById(R.id.view_to_expand);
            Animation anim = expand(view, true);
            view.startAnimation(anim);
        }
        else {
            LinearLayout view = (LinearLayout) findViewById(R.id.view_to_expand);
            Animation anim = expand(view, false);
            view.startAnimation(anim);
        }
    }

    public static Animation expand(final View v, final boolean expand) {
        try {
            Method m = v.getClass().getDeclaredMethod("onMeasure", int.class, int.class);
            m.setAccessible(true);
            m.invoke(v, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(((View) v.getParent()).getMeasuredWidth(), MeasureSpec.AT_MOST));
        } catch (Exception e) {
            e.printStackTrace();
        }
        final int initialHeight = v.getMeasuredHeight();
        if (expand) {
            v.getLayoutParams().height = 0;
        } else {
            v.getLayoutParams().height = initialHeight;
        }
        v.setVisibility(View.VISIBLE);
        Animation a = new Animation() {
            @Override
            protected void applyTransformation(float interpolatedTime,
                    Transformation t) {
                int newHeight = 0;
                if (expand) {
                    newHeight = (int) (initialHeight * interpolatedTime);
                } else {
                    newHeight = (int) (initialHeight * (1 - interpolatedTime));
                }
                v.getLayoutParams().height = newHeight;
                v.requestLayout();
                if (interpolatedTime == 1 && !expand)
                    v.setVisibility(View.GONE);
            }

            @Override
            public boolean willChangeBounds() {
                return true;
            }
        };
        a.setDuration(250);
        return a;
    }
}

Upvotes: 1

Views: 827

Answers (1)

Maggnetix
Maggnetix

Reputation: 134

you can try to use ViewSwitcher. add it to an xml layout and add your LinearLayout in it and an empty layout as well. on your application start you can start with the empty layout and then switch to the other one

<ViewSwitcher xmlns:android = "http://schemas.android.com/apk/res/android"
    android:id="@+id/layoutSwitcher"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <LinearLayout></LinearLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:padding="6dip" >

        <ImageView.... 
    </<LinearLayout>
</ViewSwitcher>

then in the code

switcher = (ViewSwitcher) findViewById(R.id.layoutSwitcher);
switcher.showNext();

Upvotes: 2

Related Questions