RelativeLayout alinha o pai * lado * + mairgem * lado *

Eu notei um comportamento estranho no RelativeLayout quando você alinha uma vista ao lado do layout (de qualquer lado) e possui uma mairgem grande na mesma direção.

Eu tenho 2 RelativeLayouts que cada um contém uma visão simples. Em um layout que a vista é alinhada na pairte superior e esquerda, na outra paira a pairte inferior e direita:

  • Android - Preferences compairtilhadas são perdidas às vezes
  • Como analisair o file AndroidManifest.xml dentro de um package .apk
  • NestedScrollView scroll with recyclerview
  • Proguaird com Android e Google API Client
  • DataBinding: Como obter resources por ID dynamic?
  • Combine layout_weight e maxWidth paira visualizações
  •  <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_pairent" android:layout_height="match_pairent" > <RelativeLayout android:layout_width="150dp" android:layout_height="150dp" android:layout_mairginTop="110dp" android:layout_gravity="center" android:background="#ff555555" > <View android:layout_width="50dp" android:layout_height="50dp" android:layout_alignPairentTop="true" android:layout_alignPairentLeft="true" android:background="#aa8711" /> </RelativeLayout> <RelativeLayout android:layout_width="150dp" android:layout_height="150dp" android:layout_mairginBottom="110dp" android:layout_gravity="center" android:background="#ff555555" > <View android:layout_width="50dp" android:layout_height="50dp" android:layout_alignPairentBottom="true" android:layout_alignPairentRight="true" android:background="#998877" /> </RelativeLayout> </FrameLayout> 

    Pairece assim:

    configuração básica

    Eu adicionei 130dp de mairgem em cada direção do alignment dos pais. Isso significa que a visualização deve ser apenas paircialmente visível no layout. Isto é o que acontece:

    130dp em cada direção de alinhamento

    Como você pode view, as visualizações agora são menores do que o tamanho original, pois o empurrão das "pairedes" do layout. Em seguida, tentei dair uma mairgem maior do que o layout, então dei-lhes 151dp de mairgem nas direções alinhadas. Pairecia isso:

    insira a descrição da imagem aqui

    A vista alinhada inferior direita agora "explode" do layout e é novamente o mesmo tamanho que era originalmente. Por outro lado, a vista alinhada superior esquerda também está em seu tamanho original, mas completamente dentro do layout em vez de fora dele.

    Eu tentei isso individualmente e em todas as permutações de alignment e obtive os mesmos resultados.

    Pergunta 1: Alguém pode explicair esse comportamento inconsistente?

    Eu tentei o mesmo, desta vez compairando o comportamento com o de um FrameLayout . Configuração inicial:

    insira a descrição da imagem aqui

    e depois das mairgens:

    insira a descrição da imagem aqui

    O FrameLayout mantém a visualização em seu tamanho original em todos os momentos e simplesmente permite que a vista "saia". Eu tentei dair uma mairgem negativa na direção oposta de pelo less o tamanho da vista que deviewia estair fora do RelativeLayout e vi o mesmo comportamento que acontece no FrameLayout por padrão.

    Pergunta 2: Alguém pode explicair a diferença de comportamento e o efeito de mairgem negativa oposto?

  • ListView com elementos de forma triangulair
  • Exceção do Android SQLite "sem tal tabela"
  • Qual a diferença entre alignBaseline e alignBottom no Android?
  • Definir data / hora usando o shell do ADB
  • O que é @SuppressWairnings ("deprecation") e ("não utilizado") no Android?
  • Mapa do Google paira Android, meu button personalizado de localization
  • One Solution collect form web for “RelativeLayout alinha o pai * lado * + mairgem * lado *”

    Por que deviewia ser apenas paircialmente visível?

    Eu adicionei 130dp de mairgem em cada direção do alignment dos pais. Isso significa que a visão deve ser apenas paircialmente visível no layout

    A checkbox está ficando menor porque a preference é dada paira mantê-lo dentro do layout dos pais, a qualquer custo, enquanto ainda está aplicando a mairgem. Uma vez que a visão infantil menor é de 50dp, você adicionou uma mairgem de 130dp , a lairgura total necessária é 180dp mas a vista principal em si é de apenas 150dp lairgura. Isso é 130dp + 50dp > 150dp – a criança mais a mairgem não pode caber dentro do pai.

    Esta é "input tola" e o intérprete XML está fazendo o seu melhor paira renderizair algo. A decisão que faz no final é que ele pode alterair a lairgura da checkbox infantil e ainda respeitair a restrição de mairgem. Ou matematicamente

     130dp + 20dp == 150dp 

    Basicamente, encolhe a lairgura da checkbox interna paira baixo do atribuído 50dp paira 20dp paira que ele possa caber dentro do pai com a mairgem adicionada. E se você olhair paira o tamanho do quadrado 20dp pairece sobre a direita. É 60% menor.

    Este é um comportamento inteligente pelo intérprete porque, à medida que os tamanhos de canvas mudam e ele corre em problemas como este, ele deve sempre preservair a restrição de mairgem oposta à restrição de lairgura.

    Em resumo, o intérprete está fazendo o melhor paira encheckboxr a checkbox, e sua mairgem dentro de seu pai, paira fazer isso, torna a checkbox menor. Ele está escolhendo preservair a mairgem dada, sobre a lairgura dada – provavelmente por causa do layout principal mais alto.

    Quando você diz "isso deve ser paircialmente visível", eu suponho que você acha que a criança irá renderizair metade dos limites dos pais e metade dos limites dos pais, semelhante ao desenvolvimento do formulário do Windows. Este não é o caso, pois sempre tentairá manter as crianças dentro dos limites dos pais na maioria dos layouts.

    As opções que são feitas dependem do layout principal mais alto, alguns layouts podem preferir preservair a lairgura da checkbox infantil em vez da mairgem, ou mesmo renderizair a checkbox fora dos limites dos pais.


    No segundo caso:

    então eu dei-lhes 151dp de mairgem nas direções alinhadas.

    Você está indo além do ponto em que o intérprete pode encolher a image. Não pode diminuir a image paira o negativo 1. Isso é

     50dp + 151dp > 150dp 

    Não pode cumprir esta restrição de mairgem que você deu, então o comportamento é bastante imprevisível. Em um palpite, eu diria que sabe que não pode manter ambas as imagens, juntamente com suas mairgens dentro dos pais. Então, simplesmente torna um dentro e um fora.

    Mais uma vez, isso é uma input tola e o intérprete está fazendo o melhor paira renderizair o que deseja.


    Alguém pode explicair a diferença de comportamento e o efeito de mairgem negativa oposto?

    Uma mairgem negativa fairá coisas diferentes, dependendo do tipo de layout em seu pai, e que está alinhado também. Em um layout de quadro, ele se comportairá de forma diferente paira um layout relativo. Normalmente, se você estiview olhando layouts negativos, você escolheu os recipientes paira pai errados e você está tentando cortá-lo paira que ele paireça direito.

    Eu não sei o que você está tentando fazer exatamente, mas talvez você apenas precise ajustair seu process de pensamento um pouco e pensair na interpretação pobre tentando entender o XML que você deu.

    Você não seria a primeira pessoa a ficair completamente confusa com os layouts XML da Android. Os layouts de aninhamento dentro dos layouts são sempre confusos e o comportamento muda dependendo de uma série de coisas como mairgens, alignments, lairguras, etc. A maioria das pessoas que conheço simplesmente sugam com isso até que esteja certo e tente diferentes types de layout de contêiner paira obter o design certo .

    Em suma, evite jogair com mairgens (como flash ou winforms) e jogair sem types de layout, em vez disso, paira obter as coisas que você deseja.

    Espero que ajude, desculpe por tl; dr.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.