2012-04-25 3 views
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 не будет снят.

Display.getRotation() не является решением, поскольку каждое устройство имеет собственный Surface.ROTATION

ответ

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 планшета) он работает как готовый.

1

Так как вы знаете, как получить текущую ориентацию, просто написать

if(isChecked){ 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
} else { 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
} 
+0

Знаете ли вы, как получить правильную ориентацию? – styanton

+0

'Display display = ((WindowManager) getSystemService (WINDOW_SERVICE)). GetDefaultDisplay(); int ориентация = дисплей.getOrientation(); '// portrait = 1; пейзаж = 2; – Pallavi

+0

@styanton принимает ответы, которые являются правильными/которые работают на вас. – Pallavi

1

Создать переменную memeber и сохранить текущее состояние набора. short 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); 
} 

Если вы не хотите сохранять и восстанавливать экземпляр, вы можете использовать его.

андроида: configChanges = «ориентация»

в вашем menifest файл не позволит воссоздать деятельность на изменение ориентации устройства.

Надеюсь, что это сработает для вас.

Если вы хотите, чтобы обнаружить обратное состояние также можно использовать

INT состояние = (WindowManager) getSystemService (WINDOW_SERVICE)) getDefaultDisplay() getRotation()..;

, если состояние является Surface.ROTATION_0, то это будет портрет , если состояние Surface.ROTATION_90 тогда это будет пейзаж , если состояние Surface.ROTATION_180 тогда это будет обратный портрет , если состояние Surface.ROTATION_270 тогда это будет be reverse landscape

комплект портрет в случае Surface.ROTATION_0 и Surface.ROTATION_180. комплект пейзаж в случае Surface.ROTATION_90 и Surface.ROTATION_270.

Вы можете также установить поворот вместо ориентации, чтобы ваше устройство находилось во вращающемся состоянии вместо ориентированного состояния.

+0

Ваш код не будет выполнен с ориентацией REVERSE_LANDSCAPE и REVERSE_PORTRAIT – styanton

+0

Если он работает для пейзажа и портрета, то вы можете заставить его работать, я дал вам представление, что вам нужно только обнаружить режим reverse_landscape и reverse_portrai и сохранить его состояние и восстановить его. –

+0

Я дал вы идете, что теперь вы можете сохранить свое обратное состояние и восстановить его навсегда, оставив все, что вам нужно, только обнаружить reverse_landscape и reverse_portrait и сохранить его. –

Смежные вопросы