У меня есть Activity
, который отображает только изображение. Я хочу, чтобы изображение вращалось при повороте телефона. Я прочитал почти все SO сообщения об изменении ориентации и это то, что я сделал:onConfigurationChanged() не вызывается при изменении ориентации
AlternateFullImageActivity.java
public class AlternateFullImageActivity extends me.imid.swipebacklayout.lib.app.SwipeBackActivity {
String API;
String photoId;
String token;
TinyDB tinyDB;
RestAdapter restAdapter;
@Bind(R.id.zoomable)
ImageView image;
PhotoViewAttacher mAttacher;
Bitmap bmp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_alternate_full_image);
SwipeBackLayout mSwipeBackLayout = getSwipeBackLayout();
mSwipeBackLayout.setEdgeTrackingEnabled(SwipeBackLayout.EDGE_ALL);
ButterKnife.bind(this);
Log.i("PP", "AlternateFullImageActivity called");
Intent intent = getIntent();
photoId = intent.getExtras().getString("ID");
RequestInterceptor requestInterceptor = new RequestInterceptor() {
@Override
public void intercept(RequestFacade request) {
request.addHeader("Accept", "application/json");
request.addHeader("Authorization", "Token " + token);
}
};
OkHttpClient okHttpClient = new OkHttpClient();
restAdapter = new RestAdapter.Builder()
.setClient(new OkClient(okHttpClient))
.setLogLevel(RestAdapter.LogLevel.FULL)
.setEndpoint(API)
.setRequestInterceptor(requestInterceptor)
.build();
PhotoAPI photoAPI = restAdapter.create(PhotoAPI.class);
photoAPI.getFeed(photoId, new Callback<ImageItem>() {
@Override
public void success(ImageItem imageItem, Response response) {
Picasso.with(AlternateFullImageActivity.this)
.load(imageItem.getPhotoUrl())
.into(new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
bmp = bitmap;
image.setImageBitmap(bmp);
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
});
mAttacher = new PhotoViewAttacher(image);
}
@Override
public void failure(RetrofitError error) {
}
});
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.i("PP", "onConfigurationChanged called");
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
image.setImageBitmap(bmp);
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
image.setImageBitmap(bmp);
}
}
activity_alternate_full_image.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000000"
tools:context="com.galleri5.android.activities.AlternateFullImageActivity">
<uk.co.senab.photoview.PhotoView
android:id="@+id/zoomable"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true" />
</RelativeLayout>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
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-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<permission android:name="com.galleri5.android.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="com.galleri5.android.permission.C2D_MESSAGE" />
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<application
android:name=".MyApplication"
android:allowBackup="true"
android:hardwareAccelerated="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:largeHeap="true"
android:theme="@style/AppTheme"
tools:replace="android:icon">
<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=".activities.FullImageActivity"
android:screenOrientation="portrait"></activity>
<activity
android:name=".activities.AlternateFullImageActivity"
android:configChanges="layoutDirection|uiMode|screenSize|orientation">
</activity>
</application>
Проблема заключается в том, что не вызывается на всех, даже на повороте телефона. Чтобы проверить, в чем проблема, я создал новый проект с одним действием, отображающим изображение и добавляющим те же флаги конфигурации в файле манифеста, и он работает там. Я не могу понять, в чем проблема и как ее решить.
Редактировать
я заметил другую вещь, когда я добавить android:screenOrientation="sensor"
для моей деятельности в файле манифеста, то изображение вращается при повороте телефона, но onCreate()
, а также вызывается каждый раз, когда я поворачиваю телефон. Теперь предположим, что эта деятельность обозначается C, тогда в этот момент back-stack активности является A-B-C. И каждый раз, когда я поворачиваю телефон, onCreate
A также получает вызов, который очень странно поглощать для меня. У меня действительно нет идей. Я определенно не хочу onCreate
любой активности, которую нужно вызвать снова. Любая помощь будет высоко оценен.
Спасибо за аккуратный подход. Но если я не добавлю никаких строк конфигурации в манифест, экран не вращается. Добавление строки конфигурации в новый проект, который я создал, чтобы попробовать работать нормально, но добавление строки конфигурации в моем текущем проекте просто не поворачивает экран. Вращение экрана работает, когда я добавляю screenOrientation = sensor. См. Редактирование. Я бы действительно использовал ваш подход, но проблема в том, что экран не вращается. Как вызвать это? –