O Chrome OS é compatível com apps Android em várias janelas. O sistema renderiza apps em contêineres de janela cujo tamanho é determinado pelo formato do dispositivo, conforme mostrado na Figura 1.

Redimensionar janelas
No Chrome OS, os usuários podem redimensionar a janela de um app normalmente, arrastando o canto inferior direito, conforme mostrado na Figura 2.

Há duas opções para gerenciar o redimensionamento de janelas:
- Responder dinamicamente às mudanças de configuração chamando
onConfigurationChanged(..)
e adicionando, por exemplo,android:configChanges="screenSize|smallestScreenSize|orientation|screenLayout"
ao manifesto da atividade. Leia os documentos sobre gerenciar mudanças de configuração para mais informações sobre o tema. - Deixar o sistema reiniciar a atividade. Nesse caso, é necessário implementar
onSaveInstanceState
e usar o componente de arquitetura ViewModel para restaurar o estado salvo anteriormente.
Esta página mostra como garantir que a janela do seu app seja iniciada corretamente, seja redimensionada com facilidade e possa exibir todo o conteúdo quando o tamanho mudar.
Dimensões da janela
Uma atividade precisa ler as dimensões da janela sempre que for iniciada e organizar o conteúdo de acordo com a configuração atual.
Para determinar a configuração atual, chame getResources().getConfiguration()
na atividade atual. Não use a
configuração da atividade em segundo plano ou do recurso do sistema.
A atividade em segundo plano não tem um tamanho, e a configuração do sistema pode
conter várias janelas com tamanhos e orientações conflitantes. Portanto, nenhum dado
utilizável pode ser extraído.
Os tamanhos da janela e da tela não são iguais. Para ver o
tamanho da janela no DP, use Activity.getResources().getConfiguration().screenWidth
e Activity.getResources().getConfiguration().screenHeight
. Você provavelmente
nunca precisará usar o tamanho da tela.
Limites de conteúdo
Os limites de conteúdo de uma janela podem ser mudados no redimensionamento. Por exemplo, a área dentro da janela usada pelo app pode mudar se a janela ficar grande demais para caber na tela. Siga as seguintes diretrizes:
- Os apps que usam o processo de layout do Android são automaticamente dispostos no espaço disponível.
Os apps nativos precisam ler a área disponível e monitorar as mudanças de tamanho para evitar a existência de elementos de IU inacessíveis. Chame os métodos a seguir para determinar o tamanho inicial disponível para essa superfície:
NativeActivity.mLastContent[X/Y/Width/Height]()
findViewById(android.R.id.content).get[Width/Height]()
O monitoramento contínuo pode ser feito por meio do observador:
NativeActivity.onContentRectChangedNative()
NativeActivity.onGlobalLayout()
- Adicione um listener a
view.addOnLayoutChangeListener(findViewById(android.R.id.content))
Se o app estiver pré-dimensionando a arte gráfica, ele fará isso sempre que a resolução for modificada.
Redimensionamento em formato livre
O Chrome OS permite que qualquer janela seja redimensionada livremente: o usuário pode mudar a largura, a altura e a posição de uma janela na tela. Muitos apps para Android são criados sem o redimensionamento livre. Considere estes problemas:
- A posição da tela pode mudar. Sempre use o sistema para realizar transformações de coordenadas de janela para tela e de tela para janela.
- Se você estiver usando o sistema de visualização do Android, o layout da janela mudará automaticamente com uma mudança de tamanho.
- Se você não usa o sistema de visualização e controla a superfície, o app precisará processar as mudanças de tamanho por conta própria.
- Os apps nativos precisam usar os membros
mLastContent
ou a visualização de conteúdo para determinar o tamanho inicial. - Quando o app estiver em execução, ele precisará detectar eventos
onContentRectChangedNative
ouonGlobalLayout
para reagir a mudanças de tamanho. - Com uma mudança de tamanho, o app precisará redimensionar ou recarregar layouts, elementos de arte e atualizar áreas de entrada.
Modo de tela cheia
O modo tela cheia funciona da mesma forma que no Android. Se a janela não estiver cobrindo a tela inteira, solicitações de tela cheia (ocultando toda a IU do sistema) serão ignoradas. Quando o app for maximizado os métodos normais de tela cheia, layouts e funções serão executados. Isso ocultará os elementos da IU do sistema (barra de controle da janela e a estante).
Orientação da tela
A orientação mais comum de um app para Android é retrato, porque é assim que a maioria dos smartphones é usada. Embora a orientação retrato seja indicada para smartphones, não é adequada para laptops e tablets, em que é preferível a orientação paisagem. Para conseguir os melhores resultados para seu app, ofereça compatibilidade para as duas orientações.
Alguns apps para Android presumem que quando um dispositivo é colocado no modo retrato,
o valor de rotação é sempre
Surface.ROTATION_0
.
Isso é válido para a maioria dos dispositivos Android. No entanto, quando o app está em um
determinado
modo ARC,
o valor de rotação para a orientação retrato pode não ser
Surface.ROTATION_0
.
Para ter um valor de rotação preciso ao ler o acelerômetro ou sensores
semelhantes, use o método Display.getRotation()
e troque o eixo corretamente.
A atividade raiz e a orientação
Uma janela do Chromebook consiste em uma pilha de janelas de atividade. Todas as janelas da pilha têm o mesmo tamanho e orientação.
Mudanças repentinas de orientação e tamanho são confusas em um ambiente de área de trabalho. O gerenciador de janelas do Chromebook evita isso de maneira semelhante ao modo lado a lado do Android: a atividade na parte inferior da pilha controla os atributos de todas as atividades acima. Isso pode causar situações inesperadas em que uma atividade recém-iniciada, não redimensionável no modo retrato, se torna redimensionável no modo paisagem.
O modo do dispositivo tem um efeito aqui: no modo tablet, a orientação não é bloqueada e cada janela preserva sua própria orientação como é normal no Android.
Diretrizes de orientação
Siga estas diretrizes para gerenciar a orientação:
- Se você oferecer compatibilidade a apenas um modo, adicione as informações ao manifesto para que o gerenciador de janelas saiba disso antes de iniciar o aplicativo. Ao especificar a orientação, especifique também as orientações do sensor, quando possível. Os Chromebooks costumam ser conversíveis, e apps de cabeça para baixo são irritantes.
- Tente manter uma única orientação selecionada. Evite solicitar uma orientação no manifesto e definir outra programaticamente mais tarde.
- Tenha cuidado ao mudar a orientação com base no tamanho da janela. O usuário pode ficar preso em uma pequena janela de retrato e não conseguir retornar a uma janela maior de paisagem.
- Há controles de janela no Chrome para alternar entre todos os layouts disponíveis. Ao escolher a opção de orientação correta, você garante que o usuário terá o layout certo ao iniciar o app. Se um app estiver disponível nos modos retrato e paisagem, sempre que possível, o modo paisagem será o padrão. Depois de definida, essa opção será memorizada em cada app.
- Evite mudanças de orientação desnecessárias. Por exemplo, se a orientação da atividade
for PORTRAIT, mas o app chamar
setRequestedOrientation(LANDSCAPE)
no momento da execução, isso causará redimensionamento desnecessário da janela, o que é irritante para o usuário e possivelmente reiniciará o app se não for possível processá-lo. É melhor definir a orientação uma vez, por exemplo, no manifesto e mudá-la se necessário.
Tamanho inicial de inicialização
Os apps podem especificar o tamanho inicial da inicialização das seguintes maneiras:
Use um tamanho de inicialização somente em ambientes de área de trabalho. Isso ajuda o gerenciador de janelas a informar os limites e a orientação corretos. Para indicar uma preferência usada no modo de área de trabalho, adicione as seguintes metatags na
<activity>
:<meta-data android:name="WindowManagerPreference:FreeformWindowSize" android:value="[phone|tablet|maximize]" /> <meta-data android:name="WindowManagerPreference:FreeformWindowOrientation" android:value="[portrait|landscape]" />
Use limites de inicialização estáticos. Use
<layout>
na entrada do manifesto da sua atividade para especificar um tamanho inicial "fixo". Veja este exemplo:<layout android:defaultHeight="500dp" android:defaultWidth="600dp" android:gravity="top|end" android:minHeight="450dp" android:minWidth="300dp" />
Use limites de inicialização dinâmicos. Uma atividade pode criar e usar
ActivityOptions.setLaunchBounds(Rect)
ao criar uma nova atividade. Ao especificar um retângulo vazio, seu app pode ser maximizado.
Outras considerações
Veja alguns outros aspectos a serem considerados ao trabalhar com apps Android no Chrome OS:
- Não chame
finish()
no métodoonDestroy
da sua atividade. Com isso, o app fecha depois do redimensionamento e não será reiniciado, supondo que ele precise da reinicialização. - Não use tipos de janela incompatíveis, como
TYPE_KEYGUARD
eTYPE_APPLICATION_MEDIA
. - Certifique-se de que uma reinicialização da atividade seja rápida, armazenando em cache objetos que foram alocados anteriormente.
- Se você não quiser que o usuário redimensione o app, especifique
android:resizeableActivity=false
no arquivo de manifesto. - Teste o app para garantir que ele processe corretamente as mudanças no tamanho da janela.