Как сделать так, чтоб при повороте экрана View элементы не уходили за его пределы?

Для того чтобы предотвратить перемещение элементов 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 при повороте экрана. Оба подхода могут быть использованы в зависимости от вашей конкретной потребности и требований.