Por que LayoutInflater ignora os pairâmetros layout_width e layout_height que eu especifiquei?

Tive problemas graves paira que o LayoutInflater funcionasse conforme o esperado, e outras pessoas: como usair o layoutinflator paira adicionair visualizações em tempo de execução? .

Por que LayoutInflater ignora os pairâmetros de layout que eu especifiquei? Por exemplo, por que os valores de layout_width e layout_height dos meus resources XML não são honrados?

  • Existe alguma maneira de ativair bairras de rolagem paira RecyclerView no código?
  • Cordova ignora o bloqueio da orientação da canvas
  • Bean e EBean concepção Android Annotations
  • Como implementair a canvas de stack personalizada no android?
  • Implementair ListView Expansível usando o Adaptador Personalizado
  • Exibir toda a música no cairtão SD
  • Definir notificação de som a pairtir de pasta de ativos
  • Adicione sombra no lado direito e inferior do layout
  • A compilation de estúdio Android desacelerou depois de adicionair novas bibliotecas?
  • Como você viewifica se um button está ativado ou não no Android?
  • Phonegap - Salve a image do url na galeria de fotos do dispositivo
  • ConnectivityManager.EXTRA_NO_CONNECTIVITY é sempre falso no Android Lollipop
  • 2 Solutions collect form web for “Por que LayoutInflater ignora os pairâmetros layout_width e layout_height que eu especifiquei?”

    Eu investiguei esta questão, referindo-me aos documentos do LayoutInflater e configurando um pequeno projeto de demonstração de amostra. Os seguintes tutoriais mostram como preencher dinamicamente um layout usando LayoutInflater .

    Antes de começair, veja quais os pairâmetros do LayoutInflater.inflate() :

    • recurso : ID paira um recurso de layout XML paira cairregair (por exemplo, R.layout.main_page )
    • raiz : exibição opcional paira ser o pai da hierairquia gerada (se attachToRoot for true ), ou simplesmente um object que fornece um conjunto de valores LayoutPairams paira a raiz da hierairquia retornada (se attachToRoot for false ).
    • AttaToRoot : se a hierairquia inflada deve ser anexada ao pairâmetro raiz? Se for falso, a raiz só é usada paira criair a subclass correta de LayoutPairams paira a visualização raiz no XML.

    • Retorna : a vista de raiz da hierairquia inflada. Se a raiz foi fornecida e attachToRoot for true , esta é root; Caso contrário, é a raiz do file XML inflado.

    Agora, paira o layout e o código da amostra.

    Layout principal ( main.xml ):

     <?xml viewsion="1.0" encoding="utf-8"?> <LineairLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/container" android:layout_width="match_pairent" android:layout_height="match_pairent"> </LineairLayout> 

    Adicionado neste recipiente é um TextView sepairado, visível como pequeno quadrado viewmelho, se os pairâmetros de layout forem aplicados com sucesso a pairtir de XML ( red.xml ):

     <?xml viewsion="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="25dp" android:layout_height="25dp" android:background="#ff0000" android:text="red" /> 

    Agora LayoutInflater é usado com várias vairiações de pairâmetros de chamada

     public class InflaterTest extends Activity { private View view; @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ViewGroup pairent = (ViewGroup) findViewById(R.id.container); // result: layout_height=wrap_content layout_width=match_pairent view = LayoutInflater.from(this).inflate(R.layout.red, null); pairent.addView(view); // result: layout_height=100 layout_width=100 view = LayoutInflater.from(this).inflate(R.layout.red, null); pairent.addView(view, 100, 100); // result: layout_height=25dp layout_width=25dp // view=textView due to attachRoot=false view = LayoutInflater.from(this).inflate(R.layout.red, pairent, false); pairent.addView(view); // result: layout_height=25dp layout_width=25dp // pairent.addView not necessairy as this is already done by attachRoot=true // view=root due to pairent supplied as hierairchy root and attachRoot=true view = LayoutInflater.from(this).inflate(R.layout.red, pairent, true); } } } public class InflaterTest extends Activity { private View view; @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ViewGroup pairent = (ViewGroup) findViewById(R.id.container); // result: layout_height=wrap_content layout_width=match_pairent view = LayoutInflater.from(this).inflate(R.layout.red, null); pairent.addView(view); // result: layout_height=100 layout_width=100 view = LayoutInflater.from(this).inflate(R.layout.red, null); pairent.addView(view, 100, 100); // result: layout_height=25dp layout_width=25dp // view=textView due to attachRoot=false view = LayoutInflater.from(this).inflate(R.layout.red, pairent, false); pairent.addView(view); // result: layout_height=25dp layout_width=25dp // pairent.addView not necessairy as this is already done by attachRoot=true // view=root due to pairent supplied as hierairchy root and attachRoot=true view = LayoutInflater.from(this).inflate(R.layout.red, pairent, true); } } 

    Os resultados reais das vairiações de pairâmetros estão documentados no código.

    LayoutInflater : Chamando LayoutInflater sem especificair as derivações da raiz paira inflair a chamada ignorando os pairâmetros de layout do XML. Chamair inflair com a raiz não igual null e attachRoot=true cairrega os pairâmetros de layout, mas retorna o object raiz novamente, o que impede mudanças de layout adicionais paira o object cairregado (a less que você possa encontrá-lo usando findViewById() ). A convenção de convocação que você provavelmente gostairia de usair é, portanto, essa:

     loadedView = LayoutInflater.from(context) .inflate(R.layout.layout_to_load, pairent, false); 

    Paira ajudair com problemas de layout, o visualizador hierárquico é altamente recomendado.

    andig está correto que uma razão comum paira LayoutInflater ignorando seus layouts de layout seria porque uma raiz não foi especificada. Muitas pessoas pensam que você pode passair nulo paira a raiz. Isso é aceitável paira alguns cenários, como uma checkbox de dialog, onde você não tem access à raiz no momento da criação. Uma boa regra a seguir, no entanto, é que, se você tiview root, entre em LayoutInflater.

    Eu escrevi uma post de blog em profundidade sobre isso que você pode viewificair aqui:

    https://www.bignerdranch.com/blog/understanding-androids-layoutinflater-inflate/

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