Investiguei esse problema, consultando os documentos LayoutInflater e configurando um pequeno projeto de demonstração de amostra. Os tutoriais a seguir mostram como preencher dinamicamente um layout usando LayoutInflater
.
Antes de começarmos, veja como são os LayoutInflater.inflate()
parâmetros:
- resource : ID para carregar um recurso de layout XML (por exemplo,
R.layout.main_page
)
- raiz : visualização opcional para ser o pai da hierarquia gerada (se
attachToRoot
for true
) ou simplesmente um objeto que fornece um conjunto de LayoutParams
valores para a raiz da hierarquia retornada (se attachToRoot
for false
).
attachToRoot : se a hierarquia inflada deve ser anexada ao parâmetro raiz? Se falso, root será usado apenas para criar a subclasse correta da LayoutParams
visualização raiz no XML.
Retorna : a visão raiz da hierarquia inflada. Se a raiz foi fornecida e attachToRoot
é true
, isso é raiz; caso contrário, é a raiz do arquivo XML inflado.
Agora, para o layout e o código de amostra.
Layout principal ( main.xml
):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>
Adicionado neste contêiner é um TextView separado, visível como um pequeno quadrado vermelho se os parâmetros de layout forem aplicados com êxito a partir de XML ( red.xml
):
<?xml version="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 variações de parâmetros de chamada
public class InflaterTest extends Activity {
private View view;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ViewGroup parent = (ViewGroup) findViewById(R.id.container);
// result: layout_height=wrap_content layout_width=match_parent
view = LayoutInflater.from(this).inflate(R.layout.red, null);
parent.addView(view);
// result: layout_height=100 layout_width=100
view = LayoutInflater.from(this).inflate(R.layout.red, null);
parent.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, parent, false);
parent.addView(view);
// result: layout_height=25dp layout_width=25dp
// parent.addView not necessary as this is already done by attachRoot=true
// view=root due to parent supplied as hierarchy root and attachRoot=true
view = LayoutInflater.from(this).inflate(R.layout.red, parent, true);
}
}
Os resultados reais das variações de parâmetros estão documentados no código.
SINOPSE: Chamar LayoutInflater
sem especificar leads raiz para aumentar a chamada, ignorando os parâmetros de layout do XML. A chamada inflar com raiz não é igual null
e attachRoot=true
carrega os parâmetros de layout, mas retorna o objeto raiz novamente, o que impede outras alterações de layout no objeto carregado (a menos que você possa encontrá-lo usando findViewById()
). A convenção de chamada que você provavelmente gostaria de usar é, portanto, esta:
loadedView = LayoutInflater.from(context)
.inflate(R.layout.layout_to_load, parent, false);
Para ajudar com problemas de layout, o Inspetor de layout é altamente recomendado.