Для того чтобы предотвратить перемещение элементов View за пределы экрана при повороте, можно использовать различные подходы, в зависимости от вашего конкретного случая.
Один из способов это сделать - использовать ConstraintLayout вместо других макетов, таких как LinearLayout или RelativeLayout. ConstraintLayout позволяет создавать гибкие и реактивные макеты, которые могут автоматически адаптироваться к изменению размеров экрана. Для достижения этого вам нужно будет настроить ограничения (constraints) для каждого элемента в макете, указывая, как эти элементы должны быть привязаны к другим элементам и к родительскому контейнеру.
Например, если у вас есть два элемента View - TextView и ImageView, и вы хотите, чтобы они оставались внутри границ экрана даже при повороте, вы можете установить ограничения для них, используя ConstraintLayout. Для этого добавьте следующий код в файл макета XML:
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toBottomOf="parent" android:text="Hello World!" /> <ImageView android:id="@+id/imageView" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintTop_toTopOf="@id/textView" app:layout_constraintStart_toEndOf="@id/textView" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toBottomOf="@id/textView" android:src="@drawable/ic_android_logo" /> </androidx.constraintlayout.widget.ConstraintLayout>
В этом примере у TextView установлены ограничения, чтобы они привязывали его к краям родительского ConstraintLayout, а ImageView - к правому краю TextView. Таким образом, независимо от того, какой ориентации экрана будет, TextView всегда будет занимать все пространство, в то время как ImageView будет располагаться справа от TextView.
Еще один способ это сделать - использовать onSaveInstanceState() и onRestoreInstanceState() методы в активности или фрагменте для сохранения и восстановления состояния View при повороте экрана.
В onSaveInstanceState() методе можно сохранить состояние всех элементов View, которые вам нужно сохранить, с помощью метода putXXX() объекта Bundle, где XXX - тип данных, например putString() или putInt(). Затем, в onRestoreInstanceState() методе, можно восстановить сохраненное состояние, используя методы getXXX(), например getString() или getInt(), и применить это состояние к соответствующим элементам View.
Пример для сохранения и восстановления состояния одного элемента EditText:
private EditText editText; private static final String EDIT_TEXT_STATE = "edit_text_state"; @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); // сохранение состояния EditText String text = editText.getText().toString(); outState.putString(EDIT_TEXT_STATE, text); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); // восстановление состояния EditText String text = savedInstanceState.getString(EDIT_TEXT_STATE); editText.setText(text); }
В этом примере текущее состояние EditText сохраняется в Bundle в onSaveInstanceState(), с помощью метода putString(). При восстановлении сохраненного состояния в onRestoreInstanceState(), значение из Bundle извлекается с помощью getString() и устанавливается обратно в EditText. Это позволяет сохранить ввод пользователя в элементе View при повороте экрана.
Таким образом, вы можете использовать ConstraintLayout для создания адаптивных макетов, которые автоматически приспосабливаются к изменению размеров экрана при повороте. Или вы можете использовать методы onSaveInstanceState() и onRestoreInstanceState() для сохранения и восстановления состояния View при повороте экрана. Оба подхода могут быть использованы в зависимости от вашей конкретной потребности и требований.