Estou com problemas com a barra de ação translúcida / navbar no novo Android KitKat (4.4) e no windowSoftInputMode="adjustResize"
.
Alterando normalmente o InputMode para AdjustResize, o aplicativo deve se redimensionar quando o teclado é mostrado ... mas aqui não! Se eu excluir as linhas do efeito transparente, o redimensionamento estará funcionando.
Portanto, se o teclado estiver visível, meu ListView estará embaixo dele e não consigo acessar os últimos itens. (Apenas ocultando o teclado manualmente)
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="XYZ"
android:versionCode="23"
android:versionName="0.1" >
<uses-sdk
android:minSdkVersion="9"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.XYZStyle" >
<activity
android:name="XYZ"
android:label="@string/app_name"
android:windowSoftInputMode="adjustResize" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
values-v19 / styles.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.XYZStyle" parent="@style/Theme.AppCompat.Light">
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
</style>
</resources>
fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/listView_contacts"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:divider="@null"
android:dividerHeight="0dp"
android:drawSelectorOnTop="true"
android:fastScrollAlwaysVisible="true"
android:fastScrollEnabled="true"
android:paddingBottom="@dimen/navigationbar__height" >
</ListView>
</RelativeLayout>
Alguém tem alguma idéia para consertar isso?
Respostas:
Está faltando a seguinte propriedade:
na raiz
RelativeLayout
do layout do fragmento .xml.Atualizar:
No ano passado, houve uma conversa interessante de Chris Bane, que explica detalhadamente como isso funciona:
https://www.youtube.com/watch?v=_mGDMVRO3iE
fonte
Há um relatório de bug relacionado aqui . Eu encontrei uma solução alternativa que, a partir de testes limitados, parece fazer o truque sem repercussões. Adicione uma implementação personalizada da sua raiz
ViewGroup
(quase sempre estou usandoFrameLayout
, então é isso que eu testei) com a lógica abaixo. Em seguida, use esse layout personalizado no lugar do layout raiz e verifique se você o definiuandroid:fitsSystemWindows="true"
. Você pode simplesmente ligar agetInsets()
qualquer momento após o layout (por exemplo, adicionar umOnPreDrawListener
) para ajustar o restante do layout para considerar as inserções do sistema, se desejado.Como
fitSystemWindow
s foi descontinuado, consulte a resposta abaixo para concluir a solução alternativa.fonte
A resposta @kcoppock é realmente útil, mas o fitSystemWindows foi descontinuado no nível 20 da API
Portanto, desde a API 20 (KITKAT_WATCH), você deve substituir onApplyWindowInsets
fonte
ViewCompat.setOnApplyWindowInsetsListener
dispatchApplyWindowInsets
vez (mesmo código) trabalhou para mimIsso funcionou para mim ter barra de status translúcida e AdjustResize no fragmento:
Faça um RelativeLayout personalizado como @ Victor91 e @kcoppock disseram.
Use CustomRelativeLayout como layout pai para seu fragmento.
Declarar o tema com o android: windowTranslucentStatus = true
A atividade do contêiner deve ser declarada no manifesto com android: windowSoftInputMode = "AdjustResize" e usar o tema declarado
Use fitsSystemWindows no layout da raiz do fragmento!
Em seguida, em xml,
fonte
Se você deseja personalizar as inserções e está direcionando o nível da API> = 21, é possível fazer isso sem precisar criar um grupo de visualizações personalizadas. Apenas definindo o
fitsSystemWindows
preenchimento será aplicado à visualização do contêiner por padrão, o que você pode não querer.As verificações de versão são incorporadas a esse método e apenas os dispositivos> = 21 executam o código dentro do lambda. Exemplo de Kotlin:
Verifique se o layout ainda define o
fitsSystemWindows
sinalizador, caso contrário o ouvinte de inserção de janela não será chamado.Essas fontes são úteis:
https://medium.com/google-developers/why-would-i-want-to-fitssystemwindows-4e26d9ce1eec https://medium.com/@azizbekian/windowinsets-24e241d4afb9
fonte
BaseFragment
, juntamente comview.fitsSystemWindows = true
e ela simplesmente funciona sem nenhuma alteração nos layouts XML reais ou nas subclasses View.Eu tive o mesmo problema, Minha atividade tinha um ScrollView como visualização raiz e, com a barra de status translúcida ativada, não foi redimensionada corretamente quando o teclado apareceu ... e, com facilidade, a tela não rolou ocultando as visualizações de entrada.
Solução: movi tudo (lógica de layout e atividade) dentro de um novo fragmento. Em seguida, alterou a atividade para incluir apenas este fragmento. Agora tudo funciona como esperado!
Este é o layout da atividade:
fonte
Com base na solução alternativa de Joseph Johnson no Android Como ajustar o layout no modo de tela cheia quando o teclado virtual está visível
chame isso
onCreate()
depoissetContentView()
em sua atividade.AndroidBug5497Workaround.assistActivity(this);
um diferente litte do original substituir
return (r.bottom - r.top);
comreturn r.bottom;
nocomputeUsableHeight()
por algum motivo, devo definir meu
fitsSystemWindows
atributo de atividade comofalse
.essa solução alternativa me salvou. Funciona bem para mim. a esperança pode ajudá-lo.
a classe de implementação é:
fonte
Não deve funcionar com a barra de status translúcida; essa configuração força a janela no modo de tela cheia, que não funciona com o AdjustResize.
Você pode usar o AdjustPan ou as propriedades fitsSystemWindows. Sugiro ler sobre o recurso, porém, tem efeitos colaterais significativos:
https://medium.com/google-developers/why-would-i-want-to-fitssystemwindows-4e26d9ce1eec
fonte
AndroidBug5497Workaround.java cuide de vazamentos de memória. precisa do código abaixo
Minha amostra usando RxJava que chama automaticamente removeOnGlobalLayoutListener () quando onPause () no ciclo de vida da atividade
fonte
Eu tive um problema.
Defino windowDrawsSystemBarBackgrounds como 'true' e meu aplicativo deve aparecer na barra de status.
É o meu tema de atividade.
e recebi ajuda do blog de jianshu . você pode ler código, mas texto como eu. Eu adiciono mais alguns códigos.
Este é o meu layout de fragmento.
Eu quero que seja útil para você. boa sorte!
fonte
fonte
Eu tive o mesmo problema. Eu resolvi usando o coordenatorlayout
activity.main.xml
content_main2.xml
MainActivity.java
agora adicione esta linha linearLayoutManager.setStackFromEnd (true);
fonte
fonte
Adicione isso primeiro no seu layout raiz.
Quando você usa essa abordagem, é de sua responsabilidade garantir que partes críticas da interface do usuário do seu aplicativo (por exemplo, os controles internos de um aplicativo Maps) não acabem sendo cobertas pelas barras do sistema. Isso pode tornar seu aplicativo inutilizável. Na maioria dos casos, você pode lidar com isso adicionando o atributo android: fitsSystemWindows ao seu arquivo de layout XML, definido como true. Isso ajusta o preenchimento do ViewGroup pai para deixar espaço para as janelas do sistema. Isso é suficiente para a maioria dos aplicativos.
Em alguns casos, no entanto, pode ser necessário modificar o preenchimento padrão para obter o layout desejado para o seu aplicativo. Para manipular diretamente como o conteúdo é apresentado em relação às barras do sistema (que ocupam um espaço conhecido como "inserções de conteúdo" da janela), substitua fitSystemWindows (inserções Rect). O método fitSystemWindows () é chamado pela hierarquia de exibição quando as inserções de conteúdo de uma janela são alteradas, para permitir que a janela ajuste seu conteúdo de acordo. Ao substituir esse método, você pode manipular as inserções (e, portanto, o layout do seu aplicativo) da maneira que desejar.
https://developer.android.com/training/system-ui/status#behind
Se você deseja se tornar um instalador da janela principal, assista ao vídeo do desenvolvedor do Android. https://www.youtube.com/watch?v=_mGDMVRO3iE
fonte
A melhor prática permite o conteúdo de rolagem do usuário quando o teclado é mostrado. Então, para adicionar essa funcionalidade, você precisa colocar seu layout raiz dentro do
ScrollView
e usarwindowSoftInputMode="adjustResize"
método activity.Mas se você quiser usar essa funcionalidade com
<item name="android:windowTranslucentStatus">true</item>
sinalizador no Android 5, o conteúdo não será rolável e se sobrepõe ao teclado.Para resolver este problema, verifique esta resposta
fonte