2

次のコードの CheckBox があります。

    CheckBox cb = (CheckBox)findViewById(R.id.freezer);
    cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (isChecked) {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
            } else {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
            }
        }
    });

そのため、チェックすると、画面がデフォルトのシステムの向き(タブレットの横向き)に回転します。

現在の向きをフリーズする必要があります。デバイスを縦向きにして CheckBox を切り替えた場合、CheckBox がオフになるまでデバイスの回転を無視する必要があります。

各デバイスには独自の Surface.ROTATION があるため、 Display.getRotation() は解決策ではありません

4

3 に答える 3

6

だから、ここに私の解決策があります。

private int getCurentOrientation() {
    Display d = ((WindowManager) getSystemService(WINDOW_SERVICE))
            .getDefaultDisplay();
    boolean isWide = d.getWidth() >= d.getHeight();
    switch (d.getRotation()) {
    case Surface.ROTATION_0:
        return isWide ? ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
                : ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
    case Surface.ROTATION_90:
        return isWide ? ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
                : ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
    case Surface.ROTATION_180:
        return isWide ? ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE
                : ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
    case Surface.ROTATION_270:
        return isWide ? ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE
                : ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
    }
    return -1;
}

private void lockOrientation(boolean lock) {
    if (lock) {
        setRequestedOrientation(getCurentOrientation());
    } else {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
    }
}

4 台のデバイス (スマートフォン 2 台とタブレット 2 台) で nedded として動作します。

于 2012-04-26T12:43:20.120 に答える
1

現在の向きを取得する方法を知っているので、次のように記述します

if(isChecked){
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
} else {
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
于 2012-04-25T05:21:17.497 に答える
1

メンバー変数を作成し、現在の設定状態を保存します。短い is_landscape = -1;

oncheckedchange リスナーを使用すると、状態を永続的に設定して保存できます。

if (is_landscape == -1) {
    Configuration config_screen = getResources().getConfiguration();
    int orientation = config_screen.orientation;
    if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
       setRequestedOrientation(Configuration.ORIENTATION_LANDSCAPE);
       is_landscape = 0;
    } else {
       setRequestedOrientation(Configuration.ORIENTATION_PORTRAIT);
       is_landscape = 1;
   }
}

問題は、デバイスを回転させるたびにアクティビティが再作成されるため、状態が失われることです。is_landscape 変数を保存するだけです

@Override
protected void onSaveInstanceState(Bundle outState) {
    oustate.putExtra("last_state", is_landscape);
    super.onSaveInstanceState(outState);
}

you can restore your position on on restore instance

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    is_landscape = savedInstanceState.getShort("last_state");
    if (is_landscape == 0) {
        setRequestedOrientation(Configuration.ORIENTATION_LANDSCAPE);
    } else if (is_landscape == 1) {
        setRequestedOrientation(Configuration.ORIENTATION_PORTRAIT);
    }
    super.onRestoreInstanceState(savedInstanceState);
}

インスタンスを保存して復元したくない場合は、使用できます。

Android:configChanges="向き"

あなたのmenifestファイルでは、デバイスの向きを変えたときにアクティビティを再作成することはできません.

それがあなたのために働くことを願っています。

リバース状態も検出したい場合は、使用できます

int state = (WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay().getRotation();

状態が Surface.ROTATION_0 の場合は縦、状態が Surface.ROTATION_90 の場合は横、状態が Surface.ROTATION_180 の場合は逆の縦、状態が Surface.ROTATION_270 の場合は逆の横になります。

Surface.ROTATION_0 と Surface.ROTATION_180 の場合は縦に設定します。Surface.ROTATION_90 と Surface.ROTATION_270 の場合はランドスケープを設定します。

デバイスが向きの状態ではなく回転状態になるように、向きの代わりに回転を設定することもできます。

于 2012-04-25T05:51:53.680 に答える