Como posso verificar se o telefone Android está no modo Paisagem ou Retrato?
Como posso verificar se o telefone Android está no modo Paisagem ou Retrato?
Respostas:
A configuração atual, conforme usada para determinar quais recursos recuperar, está disponível no Configuration
objeto 'Recursos' :
getResources().getConfiguration().orientation;
Você pode verificar a orientação observando seu valor:
int orientation = getResources().getConfiguration().orientation;
if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
// In landscape
} else {
// In portrait
}
Mais informações podem ser encontradas no Desenvolvedor Android .
android:screenOrientation="portrait"
), esse método retornará o mesmo valor, independentemente de como o usuário gire o dispositivo. Nesse caso, você usaria o acelerômetro ou o sensor de gravidade para descobrir a orientação corretamente.
Se você usar a orientação getResources (). GetConfiguration (). Em alguns dispositivos, errará. Usamos essa abordagem inicialmente em http://apphance.com . Graças ao registro remoto do Apphance, pudemos vê-lo em diferentes dispositivos e vimos que a fragmentação desempenha seu papel aqui. Vi casos estranhos: por exemplo, alternando retrato e quadrado (?!) no HTC Desire HD:
CONDITION[17:37:10.345] screen: rotation: 270 orientation: square
CONDITION[17:37:12.774] screen: rotation: 0 orientation: portrait
CONDITION[17:37:15.898] screen: rotation: 90
CONDITION[17:37:21.451] screen: rotation: 0
CONDITION[17:38:42.120] screen: rotation: 270 orientation: square
ou não alterar a orientação:
CONDITION[11:34:41.134] screen: rotation: 0
CONDITION[11:35:04.533] screen: rotation: 90
CONDITION[11:35:06.312] screen: rotation: 0
CONDITION[11:35:07.938] screen: rotation: 90
CONDITION[11:35:09.336] screen: rotation: 0
Por outro lado, a largura () e a altura () estão sempre corretas (são usadas pelo gerenciador de janelas, por isso deveria ser melhor). Eu diria que a melhor idéia é fazer a largura / altura verificando SEMPRE. Se você pensar um pouco, é exatamente isso que você deseja - saber se a largura é menor que a altura (retrato), o oposto (paisagem) ou se são iguais (quadrado).
Então se resume a este código simples:
public int getScreenOrientation()
{
Display getOrient = getWindowManager().getDefaultDisplay();
int orientation = Configuration.ORIENTATION_UNDEFINED;
if(getOrient.getWidth()==getOrient.getHeight()){
orientation = Configuration.ORIENTATION_SQUARE;
} else{
if(getOrient.getWidth() < getOrient.getHeight()){
orientation = Configuration.ORIENTATION_PORTRAIT;
}else {
orientation = Configuration.ORIENTATION_LANDSCAPE;
}
}
return orientation;
}
getWidth
e getHeight
não são preteridos.
getSize(Point outSize)
vez disso. Estou usando a API 23.
Outra maneira de resolver esse problema é não depender do valor de retorno correto da exibição, mas depender da resolução dos recursos do Android.
Crie o arquivo layouts.xml
nas pastas res/values-land
e res/values-port
com o seguinte conteúdo:
res / valores-terra / layouts.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="is_landscape">true</bool>
</resources>
res / valores-porta / layouts.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="is_landscape">false</bool>
</resources>
No seu código-fonte, agora você pode acessar a orientação atual da seguinte maneira:
context.getResources().getBoolean(R.bool.is_landscape)
Uma maneira completa de especificar a orientação atual do telefone:
public String getRotation(Context context){
final int rotation = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getOrientation();
switch (rotation) {
case Surface.ROTATION_0:
return "portrait";
case Surface.ROTATION_90:
return "landscape";
case Surface.ROTATION_180:
return "reverse portrait";
default:
return "reverse landscape";
}
}
Chear Binh Nguyen
getOrientation()
funciona, mas isso não está correto se estiver usando getRotation()
. Obter "Returns the rotation of the screen from its "natural" orientation."
fonte de rotação . Portanto, em um telefone dizendo que ROTATION_0 é retrato provavelmente está correto, mas em um tablet sua orientação "natural" é provavelmente paisagem e ROTATION_0 deve retornar paisagem em vez de retrato.
Aqui está a demonstração do snippet de código, como obter orientação da tela, foi recomendado por hackbod e Martijn :
❶ Disparar quando mudar de orientação:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
int nCurrentOrientation = _getScreenOrientation();
_doSomeThingWhenChangeOrientation(nCurrentOrientation);
}
❷ Obtenha orientação atual, como o hackbod recomenda:
private int _getScreenOrientation(){
return getResources().getConfiguration().orientation;
}
AreExistem soluções alternativas para obter a orientação atual da tela ❷ siga a solução Martijn :
private int _getScreenOrientation(){
Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
return display.getOrientation();
}
★ Nota : tentei implementar o ❷ & ❸, mas na orientação do RealDevice (NexusOne SDK 2.3), ele retorna a orientação incorreta.
★ Portanto, recomendo usar a solução ❷ para obter a orientação da tela que possui mais vantagens: claramente, simples e funciona como um encanto.
★ Verifique cuidadosamente o retorno da orientação para garantir a correção conforme o esperado (pode haver limitações, dependendo da especificação dos dispositivos físicos)
Espero que ajude,
int ot = getResources().getConfiguration().orientation;
switch(ot)
{
case Configuration.ORIENTATION_LANDSCAPE:
Log.d("my orient" ,"ORIENTATION_LANDSCAPE");
break;
case Configuration.ORIENTATION_PORTRAIT:
Log.d("my orient" ,"ORIENTATION_PORTRAIT");
break;
case Configuration.ORIENTATION_SQUARE:
Log.d("my orient" ,"ORIENTATION_SQUARE");
break;
case Configuration.ORIENTATION_UNDEFINED:
Log.d("my orient" ,"ORIENTATION_UNDEFINED");
break;
default:
Log.d("my orient", "default val");
break;
}
Use getResources().getConfiguration().orientation
da maneira certa.
Você só precisa observar diferentes tipos de paisagens, a paisagem que o dispositivo normalmente usa e a outra.
Ainda não entendo como gerenciar isso.
Algum tempo se passou desde que a maioria dessas respostas foi publicada e alguns agora usam métodos e constantes obsoletos.
Atualizei o código de Jarek para não usar mais esses métodos e constantes:
protected int getScreenOrientation()
{
Display getOrient = getWindowManager().getDefaultDisplay();
Point size = new Point();
getOrient.getSize(size);
int orientation;
if (size.x < size.y)
{
orientation = Configuration.ORIENTATION_PORTRAIT;
}
else
{
orientation = Configuration.ORIENTATION_LANDSCAPE;
}
return orientation;
}
Observe que o modo Configuration.ORIENTATION_SQUARE
não é mais suportado.
Eu achei isso confiável em todos os dispositivos em que testei, em contraste com o método que sugere o uso de getResources().getConfiguration().orientation
Verifique a orientação da tela em tempo de execução.
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Checks the orientation of the screen
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
}
}
Há mais uma maneira de fazer isso:
public int getOrientation()
{
if(getResources().getDisplayMetrics().widthPixels>getResources().getDisplayMetrics().heightPixels)
{
Toast t = Toast.makeText(this,"LANDSCAPE",Toast.LENGTH_SHORT);
t.show();
return 1;
}
else
{
Toast t = Toast.makeText(this,"PORTRAIT",Toast.LENGTH_SHORT);
t.show();
return 2;
}
}
Testado em 2019 na API 28, independentemente do usuário ter definido a orientação retrato ou não, e com um código mínimo comparado a outra resposta desatualizada , o seguinte fornece a orientação correta:
/** @return The {@link Configuration#ORIENTATION_SQUARE}, {@link Configuration#ORIENTATION_PORTRAIT}, {@link Configuration#ORIENTATION_LANDSCAPE} constants based on the current phone screen pixel relations. */
private int getScreenOrientation()
{
DisplayMetrics dm = context.getResources().getDisplayMetrics(); // Screen rotation effected
if(dm.widthPixels == dm.heightPixels)
return Configuration.ORIENTATION_SQUARE;
else
return dm.widthPixels < dm.heightPixels ? Configuration.ORIENTATION_PORTRAIT : Configuration.ORIENTATION_LANDSCAPE;
}
Eu acho que esse código pode funcionar após a mudança de orientação ter efeito
Display getOrient = getWindowManager().getDefaultDisplay();
int orientation = getOrient.getOrientation();
substitua a função Activity.onConfigurationChanged (Configuration newConfig) e use newConfig, orientação se desejar ser notificado sobre a nova orientação antes de chamar setContentView.
Eu acho que usar getRotationv () não ajuda porque http://developer.android.com/reference/android/view/Display.html#getRotation%28%29 getRotation () Retorna a rotação da tela do seu "natural" orientação.
portanto, a menos que você conheça a orientação "natural", a rotação não faz sentido.
eu encontrei uma maneira mais fácil,
Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;
if(width>height)
// its landscape
por favor me diga se há algum problema com este alguém?
tal é sobreposição de todos os telefones, como oneplus3
public static boolean isScreenOriatationPortrait(Context context) {
return context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT;
}
código correto da seguinte maneira:
public static int getRotation(Context context){
final int rotation = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getOrientation();
if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180){
return Configuration.ORIENTATION_PORTRAIT;
}
if(rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270){
return Configuration.ORIENTATION_LANDSCAPE;
}
return -1;
}
Post antigo que eu conheço. Qualquer que seja a orientação ou a troca, etc. Projetei essa função que é usada para definir o dispositivo na orientação correta, sem a necessidade de saber como os recursos de retrato e paisagem são organizados no dispositivo.
private void initActivityScreenOrientPortrait()
{
// Avoid screen rotations (use the manifests android:screenOrientation setting)
// Set this to nosensor or potrait
// Set window fullscreen
this.activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
DisplayMetrics metrics = new DisplayMetrics();
this.activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
// Test if it is VISUAL in portrait mode by simply checking it's size
boolean bIsVisualPortrait = ( metrics.heightPixels >= metrics.widthPixels );
if( !bIsVisualPortrait )
{
// Swap the orientation to match the VISUAL portrait mode
if( this.activity.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT )
{ this.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); }
else { this.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT ); }
}
else { this.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); }
}
Funciona como um encanto!
Use desta maneira,
int orientation = getResources().getConfiguration().orientation;
String Orintaion = "";
switch (orientation)
{
case Configuration.ORIENTATION_UNDEFINED: Orintaion = "Undefined"; break;
case Configuration.ORIENTATION_LANDSCAPE: Orintaion = "Landscrape"; break;
case Configuration.ORIENTATION_PORTRAIT: Orintaion = "Portrait"; break;
default: Orintaion = "Square";break;
}
na corda você tem o oriantion
existem muitas maneiras de fazer isso, esse trecho de código funciona para mim
if (this.getWindow().getWindowManager().getDefaultDisplay()
.getOrientation() == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
// portrait mode
} else if (this.getWindow().getWindowManager().getDefaultDisplay()
.getOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
// landscape
}
Eu acho que essa solução é fácil
if (context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT){
user_todat_latout = true;
} else {
user_todat_latout = false;
}
Simples código de duas linhas
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
// do something in landscape
} else {
//do in potrait
}
Simples e fácil :)
No arquivo java, escreva:
private int intOrientation;
no onCreate
método e antes de setContentView
escrever:
intOrientation = getResources().getConfiguration().orientation;
if (intOrientation == Configuration.ORIENTATION_PORTRAIT)
setContentView(R.layout.activity_main);
else
setContentView(R.layout.layout_land); // I tested it and it works fine.
Também é importante notar que hoje em dia, há menos boas razões para procurar orientação explícita, getResources().getConfiguration().orientation
se você estiver fazendo isso por motivos de layout, pois o Suporte para várias janelas introduzido no Android 7 / API 24+ pode mexer com seus layouts bastante nos orientação. É melhor considerar o uso <ConstraintLayout>
e layouts alternativos, dependendo da largura ou altura disponíveis , juntamente com outros truques para determinar qual layout está sendo usado, por exemplo, a presença ou não de certos fragmentos anexados à sua atividade.
Você pode usar isso (com base aqui ):
public static boolean isPortrait(Activity activity) {
final int currentOrientation = getCurrentOrientation(activity);
return currentOrientation == ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT || currentOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
}
public static int getCurrentOrientation(Activity activity) {
//code based on https://www.captechconsulting.com/blog/eric-miles/programmatically-locking-android-screen-orientation
final Display display = activity.getWindowManager().getDefaultDisplay();
final int rotation = display.getRotation();
final Point size = new Point();
display.getSize(size);
int result;
if (rotation == Surface.ROTATION_0
|| rotation == Surface.ROTATION_180) {
// if rotation is 0 or 180 and width is greater than height, we have
// a tablet
if (size.x > size.y) {
if (rotation == Surface.ROTATION_0) {
result = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
} else {
result = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
}
} else {
// we have a phone
if (rotation == Surface.ROTATION_0) {
result = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
} else {
result = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
}
}
} else {
// if rotation is 90 or 270 and width is greater than height, we
// have a phone
if (size.x > size.y) {
if (rotation == Surface.ROTATION_90) {
result = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
} else {
result = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
}
} else {
// we have a tablet
if (rotation == Surface.ROTATION_90) {
result = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
} else {
result = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
}
}
}
return result;
}