如何检测屏幕旋转?

Mer*_*nBG 12 android rotation

是否可以检测屏幕旋转?我的意思是 - 只有轮换,这与活动初始化与另一个活动明显不同?

该onXxx方法似乎不是这个有用,我曾尝试添加/删除一个flagstarting Intent(去除似乎并没有得到体现,在旋转的标志是存在的),并尝试添加机器人:configChanges ="方向"为清单中的活动,但该onConfigurationChanged方法似乎每隔一次旋转调用...有线.

我想我错过了一些东西......但是在其他相关主题中没有找到明确的解决方案.

有任何想法吗?

kan*_*pan 18

表现:

<activity android:name=".MyActivity" android:configChanges="screenSize|orientation|screenLayout|navigation"/>
Run Code Online (Sandbox Code Playgroud)

活动:

@Override
public void onConfigurationChanged(Configuration newConfig)
{
    Log.d("tag", "config changed");
    super.onConfigurationChanged(newConfig);

    int orientation = newConfig.orientation;
    if (orientation == Configuration.ORIENTATION_PORTRAIT)
        Log.d("tag", "Portrait");
    else if (orientation == Configuration.ORIENTATION_LANDSCAPE)
        Log.d("tag", "Landscape");
    else
        Log.w("tag", "other: " + orientation);

    ....
}
Run Code Online (Sandbox Code Playgroud)

也尝试这个链接

如何检测屏幕旋转


Ake*_*ist 7

使用 onConfigurationChanged 方法来检测屏幕旋转不是一个好主意。当用户旋转屏幕时,此活动中的配置更改将无法正常工作。

所以我使用这个解决方案来解决这个问题。

public class SampleActivity extends AppCompatActivity {
    public static final String KEY_LAST_ORIENTATION = "last_orientation";
    private int lastOrientation;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        if (savedInstanceState == null) {
            lastOrientation = getResources().getConfiguration().orientation;
        }
    }

    @Override
    protected void onStart() {
        super.onStart();
        checkOrientationChanged();
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        lastOrientation = savedInstanceState.getInt(KEY_LAST_ORIENTATION);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt(KEY_LAST_ORIENTATION, lastOrientation);
    }

    private void checkOrientationChanged() {
        int currentOrientation = getResources().getConfiguration().orientation;
        if (currentOrientation != lastOrientation) {
            onScreenOrientationChanged(currentOrientation);
            lastOrientation = currentOrientation;
        }
    }

    public void onScreenOrientationChanged(int currentOrientation) {
        // Do something here when screen orientation changed
    }
}
Run Code Online (Sandbox Code Playgroud)

但是代码仍然不够好,无法在我的项目中使用它,所以我将此代码应用于我自己的库(https://github.com/akexorcist/ScreenOrientationHelper)。

compile 'com.akexorcist:screenorientationhelper:<latest_version>'
Run Code Online (Sandbox Code Playgroud)

您可以像这样创建基本活动类

    public class BaseActivity extends AppCompatActivity implements ScreenOrientationHelper.ScreenOrientationChangeListener {
    private ScreenOrientationHelper helper = new ScreenOrientationHelper(this);

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        helper.onCreate(savedInstanceState);
        helper.setScreenOrientationChangeListener(this);
    }

    @Override
    protected void onStart() {
        super.onStart();
        helper.onStart();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        helper.onSaveInstanceState(outState);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        helper.onRestoreInstanceState(savedInstanceState);
    }

    @Override
    public void onScreenOrientationChanged(int orientation) {

    }
}
Run Code Online (Sandbox Code Playgroud)

然后用这个基类扩展活动

public class MainActivity extends BaseActivity {

    ...

    @Override
    public void onScreenOrientationChanged(int orientation) {
        // Do something when screen orientation changed
    }
}
Run Code Online (Sandbox Code Playgroud)

完毕!