Поворот экрана Android не вступает в силу

#android #kotlin #android-6.0-marshmallow #screen-orientation #screen-rotation

#Android #kotlin #android-6.0-marshmallow #ориентация экрана #поворот экрана

Вопрос:

Могу ли я проверить, как я могу повернуть экран с помощью кода в Android?
Устройство (Android 6 ARM CPU), которое я использую, не имеет датчика для обнаружения изменения ориентации, и мне нужно сделать это вручную.
Проблема этого устройства в том, что оно не сохранит настройки, как только я изменю ориентацию экрана через меню настроек.
При следующем включении он вернется к «Ландшафту» по умолчанию.
Я пытался использовать приведенные ниже коды (по одному), чтобы изменить его, он не работает (означает, что экран не меняется).

 Settings.System.putInt(contentResolver, Settings.System.USER_ROTATION, 1);

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
  

На этом устройстве есть два варианта (поворот экрана и внешний поворот экрана).
Мне нужно изменить обе ориентации, чтобы достичь того, чего я хочу, с помощью настройки — опции отображения.
Для меня подходят коды Kotlin или Java. Любой совет?

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

Ответ №1:

Вы не можете вращать ядро Android из своего приложения, но вы можете создать пользовательский макет в своем проекте и управлять им самостоятельно следующим образом :

сначала создайте пользовательский макет :

 import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.WindowManager;
import android.widget.FrameLayout;

public class URotateLayout extends FrameLayout{
    public static final String TAG = "URotateLayout";
    public static final int ORIENTATION_PORTRAIT = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
    public static final int ORIENTATION_LANDSCAPE = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
    public static final int ORIENTATION_SENSOR_LANDSCAPE = ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE;
    public static final int ORIENTATION_SENSOR_PORTRAIT = ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT;
    public static final int ORIENTATION_SENSOR = ActivityInfo.SCREEN_ORIENTATION_SENSOR;
    public static final int ORIENTATION_LOCKED = ActivityInfo.SCREEN_ORIENTATION_LOCKED;

    private int mOrientation;
    private int mLastOrientation;

    private int mDefaultVideoContainerWidth;
    private int mDefaultVideoContainerHeight;

    private int mScreenWidth;
    private int mScreenHeight;

    public URotateLayout(Context context) {
        super(context);
    }

    public URotateLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public URotateLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public void updateScreenWidthAndHeight() {
        Display display = ((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
        DisplayMetrics metrics = new DisplayMetrics();
        display.getMetrics(metrics);
        mScreenWidth = metrics.widthPixels;
        mScreenHeight = metrics.heightPixels;
    }

    public boolean isLandscape() {
        updateScreenWidthAndHeight();
        return mScreenWidth > mScreenHeight;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        updateScreenWidthAndHeight();
        if (isLandscape()) {
            mDefaultVideoContainerWidth = mScreenWidth;
            mDefaultVideoContainerHeight = mScreenHeight;
        } else {
            mDefaultVideoContainerWidth = mScreenWidth;
         //   mDefaultVideoContainerHeight = mScreenWidth * 9 / 16;
            mDefaultVideoContainerHeight=mScreenHeight;
        }
        setMeasuredDimension(mDefaultVideoContainerWidth, mDefaultVideoContainerHeight);
    }

    public int getOrientation() {
        return mOrientation;
    }

    public void setOrientation(int orientation) {
        if (getContext() instanceof Activity) {
            Activity mActivity = (Activity) getContext();
            switch (orientation) {
                case ORIENTATION_PORTRAIT:
                    mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                    break;
                case ORIENTATION_LANDSCAPE:
                    mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                    break;
                case ORIENTATION_SENSOR_LANDSCAPE:
                    mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
                    break;
                case ORIENTATION_SENSOR_PORTRAIT:
                    mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
                    break;
                case ORIENTATION_SENSOR:
                    mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
                    break;
                case ORIENTATION_LOCKED:
                    mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
                    break;
            }
            mOrientation = orientation;
            invalidate();
        }
    }

    public void locked() {
        mLastOrientation = mOrientation;
        setOrientation(ORIENTATION_LOCKED);
    }

    public boolean isLocked() {
        return mOrientation == ORIENTATION_LOCKED ? true : false;
    }

    public void unlocked() {
        setOrientation(mLastOrientation);
    }

    public void toggleOrientation() {
        if (getContext() instanceof Activity amp;amp; mOrientation != ORIENTATION_LOCKED) {
            Activity mActivity = (Activity) getContext();
            if (isLandscape()) {
                mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
            } else {
                mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
            }
            if (mOrientation == ORIENTATION_SENSOR) {
                getHandler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        setOrientation(mOrientation);
                    }
                }, 2000);
            }
        }
    }
}

  

Во-вторых, добавьте это в свой макет, XML-файл, подобный этому :

     <yourPackage_name.URotateLayout
        android:id="@ id/rotate_layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center">

     <your_layout_here/>

    </yourPackage_name.URotateLayout>
  

наконец, используйте его в своей деятельности или фрагменте, подобном этому :

 
   //define the view i use the **butterknife**
   @Bind(R.id.rotate_layout)
    URotateLayout rotateLayout;



    @Override
    public void toggleScreenOrientation() {
        if (rotateLayout != null) {
            rotateLayout.toggleOrientation();
        }
    }

    //use this for set oriention
    public void setScreenOriention(int oriention) {
            rotateLayout.setOrientation(oriention);
    }

  

Комментарии:

1. Это может быть полезно для других. Я оставлю все как есть. Причина, по которой я не могу использовать этот метод: пользователь хочет повернуть весь экран (не только мое приложение, весь системный экран). Они не хотят просматривать детали из меню настроек, чтобы изменить его.