0

I have an activity which just shows an image in the center, with the width of image matching parent and height, wrapping content. I want the imageView to rotate on rotating the device. So suppose if I rotate the device to landscape mode, the image should fill the whole width(actually device height) and height should wrap content. How can I achieve this functionality?

Here is my AndroidManifest.xml :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.galleri5.android" >

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <uses-feature
        android:name="android.hardware.camera"
        android:required="false" />

    <application
        android:name=".Galleri5Application"
        android:allowBackup="true"
        android:debuggable="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:largeHeap="true"
        android:theme="@style/AppTheme" >
        <receiver
            android:name="com.google.android.gms.analytics.AnalyticsReceiver"
            android:enabled="true" >
            <intent-filter>
                <action android:name="com.google.android.gms.analytics.ANALYTICS_DISPATCH" />
            </intent-filter>
        </receiver>

        <service
            android:name="com.google.android.gms.analytics.AnalyticsService"
            android:enabled="true"
            android:exported="false" />

        <receiver
            android:name="com.google.android.gms.analytics.CampaignTrackingReceiver"
            android:exported="true" >
            <intent-filter>
                <action android:name="com.android.vending.INSTALL_REFERRER" />
            </intent-filter>
        </receiver>

        <service android:name="com.google.android.gms.analytics.CampaignTrackingService" />

        <meta-data
            android:name="com.facebook.sdk.ApplicationId"
            android:value="@string/facebook_app_id" />

        <activity
            android:name=".activities.LaunchActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.facebook.FacebookActivity"
            android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
            android:label="@string/app_name"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" />
        <activity
            android:name=".activities.SignInActivity"
            android:label="@string/title_activity_sign_in"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".activities.EmailSignInActivity"
            android:label="@string/title_activity_email_sign_in"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".activities.InfoActivity"
            android:label="@string/title_activity_info"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".activities.SelfieActivity"
            android:label="@string/title_activity_selfie"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".activities.PhotoAdjustActivity"
            android:label="@string/title_activity_photo_adjust"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".activities.GetStartedActivity"
            android:label="@string/title_activity_get_started"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".activities.RecommendedGalleriesActivity"
            android:label="@string/title_activity_recommended_galleries"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".activities.TipsActivity"
            android:label="@string/title_activity_tips"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".activities.HomeActivity"
            android:label="@string/title_activity_home"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".activities.UserProfileActivity"
            android:label="@string/title_activity_user_profile"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".activities.ImageActivity"
            android:label="@string/title_activity_image"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="stateHidden" >
        </activity>
        <activity
            android:name=".activities.GalleryActivity"
            android:label="@string/title_activity_architecture"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".activities.FbImageSelectionActivity"
            android:label="@string/title_activity_fb"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".activities.TestActivity"
            android:label="@string/title_activity_test" >
        </activity>
        <activity
            android:name=".activities.AddCaptionActivity"
            android:label="@string/title_activity_add_caption"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".activities.SelectGalleryActivity"
            android:label="@string/title_activity_select_gallery"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="stateHidden" >
        </activity>
        <activity
            android:name=".activities.SettingsActivity"
            android:label="@string/title_activity_settings"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".activities.EditProfileActivity"
            android:label="@string/title_activity_edit_profile"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".activities.HiFiveActivity"
            android:label="@string/title_activity_hi_five"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".activities.MessagesActivity"
            android:label="@string/title_activity_messages"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".activities.SearchActivity"
            android:label="@string/title_activity_search"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="stateHidden" >
        </activity>
        <activity
            android:name=".activities.CommentsActivity"
            android:label="@string/title_activity_comments"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".activities.DiscoverActivity"
            android:label="@string/title_activity_discover"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".activities.TOCActivity"
            android:label="@string/title_activity_toc"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".activities.HelpActivity"
            android:label="@string/title_activity_help"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="stateHidden" >
        </activity>
        <activity
            android:name=".activities.KarmaActivity"
            android:label="@string/title_activity_karma"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".activities.HowKarmaWorks"
            android:label="@string/title_activity_how_karma_works"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".activities.HiFiveOrNotActivity"
            android:label="@string/title_activity_hi_five_or_not"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".activities.DiscoverTalentsActivity"
            android:label="@string/title_activity_discover_talents"
            android:screenOrientation="portrait" >
        </activity>

        <meta-data
            android:name="io.fabric.ApiKey"
            android:value="494aaf4ca421e4bdd34df14063fae3a229af051c" />

        <activity
            android:name=".activities.UserStudioFansActivity"
            android:label="@string/title_activity_user_studio_fans"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".activities.UserStudioBookmarksActivity"
            android:label="@string/title_activity_user_studio_bookmarks"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".activities.UserStudioGalleriesActivity"
            android:label="@string/title_activity_user_studio_galleries"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".activities.UserHiFiveDetailsActivity"
            android:label="@string/title_activity_user_hi_five_details"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".activities.GalleryGridActivity"
            android:label="@string/title_activity_gallery_grid"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".activities.LeaderboardActivity"
            android:label="@string/title_activity_leaderboard"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".activities.GalleryFollowersActivity"
            android:label="@string/title_activity_gallery_followers"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".activities.AddNewGalleryActivity"
            android:label="@string/title_activity_add_new_gallery"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".activities.AllGalleriesActivity"
            android:label="@string/title_activity_all_galleries"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="stateHidden" >
        </activity>
        <activity
            android:name=".activities.AddToNewGalleryActivity"
            android:label="@string/title_activity_add_to_new_gallery"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".activities.TermsAndPrivacyActivity"
            android:label="@string/title_activity_terms_and_privacy"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".activities.WinKarmaDummyActivity"
            android:label="@string/title_activity_win_karma_dummy"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".activities.HelpModeActivity"
            android:label="@string/title_activity_help_mode"
            android:screenOrientation="portrait" >
        </activity>
        <activity android:name=".activities.OverallLeaderboardActivity" >
        </activity>
        <activity android:name=".activities.SignInHelpActivity" >
        </activity>
        <activity android:name=".activities.FullImageActivity" >
        </activity>
    </application>

</manifest>

The activity in question is FullImageActivity

Edit The problem is, the image is not getting rotated even when I am rotating the device and I have auto-rotation turned on in my phone.

Edit 1 Logcat of error when I rotate screen to landscape and then back to portrait :

10-30 16:37:30.518 4613-4613/com.galleri5.android E/AndroidRuntime: FATAL EXCEPTION: main
10-30 16:37:30.518 4613-4613/com.galleri5.android E/AndroidRuntime: Process: com.galleri5.android, PID: 4613
10-30 16:37:30.518 4613-4613/com.galleri5.android E/AndroidRuntime: java.lang.IllegalArgumentException: View=com.android.internal.policy.impl.PhoneWindow$DecorView{4ad2fb5 V.E..... R......D 0,0-1248,348} not attached to window manager
10-30 16:37:30.518 4613-4613/com.galleri5.android E/AndroidRuntime:     at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:386)
10-30 16:37:30.518 4613-4613/com.galleri5.android E/AndroidRuntime:     at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:312)
10-30 16:37:30.518 4613-4613/com.galleri5.android E/AndroidRuntime:     at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:84)
10-30 16:37:30.518 4613-4613/com.galleri5.android E/AndroidRuntime:     at android.app.Dialog.dismissDialog(Dialog.java:341)
10-30 16:37:30.518 4613-4613/com.galleri5.android E/AndroidRuntime:     at android.app.Dialog.dismiss(Dialog.java:324)
10-30 16:37:30.518 4613-4613/com.galleri5.android E/AndroidRuntime:     at com.galleri5.android.activities.HomeActivity$2.success(HomeActivity.java:126)
10-30 16:37:30.518 4613-4613/com.galleri5.android E/AndroidRuntime:     at com.galleri5.android.activities.HomeActivity$2.success(HomeActivity.java:118)
10-30 16:37:30.518 4613-4613/com.galleri5.android E/AndroidRuntime:     at retrofit.CallbackRunnable$1.run(CallbackRunnable.java:45)
10-30 16:37:30.518 4613-4613/com.galleri5.android E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:739)
10-30 16:37:30.518 4613-4613/com.galleri5.android E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:95)
10-30 16:37:30.518 4613-4613/com.galleri5.android E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:135)
10-30 16:37:30.518 4613-4613/com.galleri5.android E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5254)
10-30 16:37:30.518 4613-4613/com.galleri5.android E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
10-30 16:37:30.518 4613-4613/com.galleri5.android E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372)
10-30 16:37:30.518 4613-4613/com.galleri5.android E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898)
10-30 16:37:30.518 4613-4613/com.galleri5.android E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693)
Amit Tiwari
  • 3,684
  • 6
  • 33
  • 75

1 Answers1

0

To my knowledge, you've got two options.

  • Considering two different images; one for portrait and one for landscape. Put them to corresponding drawable/mipmap folder.

    drawable / drawable-land / mipmap / mipmap-land
    
  • Rotating image programmically. For this, you should first determine at which orientation the device is, then rotate the image accordingly.

    • Use getresources().getconfiguration().orientation to determine the orientation.

    • Use the following code to rotate the image.

      Matrix matrix = new Matrix();
      matrix.postRotate(90);
      Bitmap rotatedBitmap = Bitmap.createBitmap(bitmap , 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
      

Note: The first approach is much better!

frogatto
  • 28,539
  • 11
  • 83
  • 129
  • I don't think the first method would work for me, since I am not showing a static image. The image is pulled from backend in real time. – Amit Tiwari Oct 30 '15 at 10:43
  • also, do you have any idea, why my other activities are not rotating even I haven't set portrait mode in AndroidManifest and I have auto-rotate on? – Amit Tiwari Oct 30 '15 at 10:45
  • @AmitTiwari So, you could try the second one! – frogatto Oct 30 '15 at 10:45
  • @AmitTiwari You've set already `android:screenOrientation="portrait"` – frogatto Oct 30 '15 at 10:47
  • I haven't set that for my FullImageActivity. See my AndroidManifest.xml file. – Amit Tiwari Oct 30 '15 at 10:49
  • I checked that out, it works. Now the screen rotates. But I have new problem, when I first rotate screen to landscape mode and then again to portrait mode, my app crashes. I am getting some error in the previous activity(back stack) of this current activity. – Amit Tiwari Oct 30 '15 at 11:05
  • @AmitTiwari Post stacktrace (Logcat). – frogatto Oct 30 '15 at 11:06
  • @AmitTiwari In your second Activity, do you open any additional `window`? (Dialog, PopupWindow, ...) – frogatto Oct 30 '15 at 11:12
  • no, in the previous activity(HomeActivity), I show a dialog when user logouts – Amit Tiwari Oct 30 '15 at 11:14
  • @AmitTiwari In my experiences, you should close/dismiss all open windows when you want to leave an activity and switch to another one. – frogatto Oct 30 '15 at 11:15
  • there is no open window or dialog when I open my current activity. Actually the HomeActivity is kind of facebook feed which has photos and when you click on any photo, I open this activity to show the image in full screen. In HomeActivity, I have a navigation drawer, which has logout button, onClicking it, I show a dialog for 2 sec that you have been logged out and go back to the sign in screen for users to login again. – Amit Tiwari Oct 30 '15 at 11:18
  • How is this landscape to portrait if the source and the destination width and height is the same? Shouldn't the rotated bitmap has the height as width and width as height? – Csaba Toth Jan 24 '23 at 22:20