I am trying to handle the rotation for a complex view manually, including restoring the position and size of the prefix. At this moment I am trying to do this in onLayout (better ideas are welcome). Sometimes this works well, but often the first rotation is misuse or viewing is drawn without children.
private int oldOrientation = -1; @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { Log.e("mylayout", "onLayout " + df.format(new Date(Calendar.getInstance().getTimeInMillis()))); if (isInEditMode()) { super.onLayout(changed, left, top, right, bottom); } else { dragView.setVisibility(INVISIBLE); if (isDragViewAtTop() && (oldOrientation != getResources().getConfiguration().orientation || oldOrientation == -1)) { dragView.layout(left, top, right, transformer.getOriginalHeight()); secondView.layout(left, transformer.getOriginalHeight(), right, bottom); ViewHelper.setY(dragView, top); ViewHelper.setY(secondView, transformer.getOriginalHeight()); ViewHelper.setX(dragView, left); ViewHelper.setX(secondView, left); oldOrientation = getResources().getConfiguration().orientation; } else if (isClosedAtLeft() && ( oldOrientation != getResources().getConfiguration().orientation || oldOrientation == -1)) { dragView.layout(left, top, right, transformer.getOriginalHeight()); secondView.layout(left, transformer.getOriginalHeight(), right, bottom); ViewHelper.setY(dragView, top); ViewHelper.setY(secondView, transformer.getOriginalHeight()); ViewHelper.setX(dragView, left); ViewHelper.setX(secondView, left); closeToLeft(); oldOrientation = getResources().getConfiguration().orientation; } else if (isClosedAtRight() && ( oldOrientation != getResources().getConfiguration().orientation || oldOrientation == -1)) { dragView.layout(left, top, right, transformer.getOriginalHeight()); secondView.layout(left, transformer.getOriginalHeight(), right, bottom); ViewHelper.setY(dragView, top); ViewHelper.setY(secondView, transformer.getOriginalHeight()); ViewHelper.setX(dragView, left); ViewHelper.setX(secondView, left); closeToRight(); oldOrientation = getResources().getConfiguration().orientation; } else if ((oldOrientation != getResources().getConfiguration().orientation || oldOrientation == -1)) { dragView.layout(left, top, right, transformer.getOriginalHeight()); secondView.layout(left, transformer.getOriginalHeight(), right, bottom); ViewHelper.setY(dragView, top); ViewHelper.setY(secondView, transformer.getOriginalHeight()); ViewHelper.setX(dragView, left); ViewHelper.setX(secondView, left); smoothSlideTo(SLIDE_BOTTOM); oldOrientation = getResources().getConfiguration().orientation; } dragView.setVisibility(VISIBLE); } }
In this code, I try to restore the initial stte after rotation, when onLayout is called, and then moves it into place, the view was before rotation (there are 4 states, from the cross to the left, from the screen to the right, the upper part of the screen or the lower right corner).
Edit:
<?xml version="1.0" encoding="utf-8"?> <manifest package="com.github.pedrovgs.sample" xmlns:android="http://schemas.android.com/apk/res/android"> <uses-sdk android:minSdkVersion="8" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-feature android:glEsVersion="0x00020000" android:required="true" /> <application android:name=".DraggablePanelApplication" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="AIzaSyC1rMU-mkhoyTvBIdTnYU0dss0tU9vtK48" /> <activity android:name=".activity.MainActivity" android:configChanges="keyboardHidden|orientation|screenSize" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".activity.PlacesSampleActivity" android:configChanges="keyboardHidden|orientation|screenSize" android:label="@string/places_sample_activity_title" /> <activity android:name=".activity.TvShowsActivity" android:label="@string/tv_shows_sample_activity_title" /> <activity android:name=".activity.YoutubeSampleActivity" android:configChanges="keyboardHidden|orientation|screenSize" android:label="@string/youtube_sample_activity_title" /> <activity android:name=".activity.VideoSampleActivity" android:configChanges="keyboardHidden|orientation|screenSize" android:label="@string/video_sample_activity_title" /> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> </application> </manifest>
xml sample activity
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:draggable_panel="http://schemas.android.com/apk/res-auto" android:id="@+id/fl_container" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/iv_thumbnail" android:layout_width="fill_parent" android:layout_height="fill_parent" style="@style/image_view"/> <com.github.pedrovgs.DraggablePanel android:id="@+id/draggable_panel" android:layout_width="fill_parent" android:layout_height="fill_parent" draggable_panel:x_scale_factor="@dimen/x_scale_factor" draggable_panel:y_scale_factor="@dimen/y_scale_factor" draggable_panel:top_fragment_height="@dimen/top_fragment_height" draggable_panel:top_fragment_margin_right="@dimen/top_fragment_margin" draggable_panel:top_fragment_margin_bottom="@dimen/top_fragment_margin" draggable_panel:enable_horizontal_alpha_effect="false"/> </FrameLayout>