Como inflar uma vista com um layout

221

Eu tenho um layout definido em XML. Contém também:

<RelativeLayout
    android:id="@+id/item"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
/>

Eu gostaria de inflar esse RelativeView com outro arquivo de layout XML. Eu posso usar layouts diferentes, dependendo da situação. Como devo fazer isso? Eu estava tentando diferentes variações de

RelativeLayout item = (RelativeLayout) findViewById(R.id.item);
item.inflate(...)

Mas nenhum deles funcionou bem.

Michal Dymel
fonte

Respostas:

390

Não tenho certeza se segui sua pergunta. Você está tentando anexar uma visão filho ao RelativeLayout? Nesse caso, você deseja fazer algo como:

RelativeLayout item = (RelativeLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, null);
item.addView(child);
Graeme Duncan
fonte
3
Eu recebo um erro: 02-25 22: 21: 19.324: ERROR / AndroidRuntime (865): Causado por: java.lang.IllegalStateException: O filho especificado já tem um pai. Você deve chamar removeView () no pai da criança primeiro.
Michal Dymel
27
Apenas tentei isso agora, eu precisava: View child = getLayoutInflater (). Inflate (R.layout.child, null);
24412 James
3
O problema não é o código. É bastante fácil seguir o código. Onde você cria o arquivo xml. o tipo é um recurso de estilo de tema? O problema que eu acho que as pessoas me incluídos é onde estamos colocando este arquivo xml
Lpc_dark
15
Isso não é perfeito. A versão 3-param da inflater deve ser usado - aqui está o porquê: doubleencore.com/2013/05/layout-inflation-as-intended
Nick Cardoso
3
A resposta está incorreta, mesmo que funcione. Verifique este post possiblemobile.com/2013/05/layout-inflation-as-intended
ARK
107

Você aumenta um recurso XML. Consulte o documento LayoutInflater .

Se seu layout estiver em um mylayout.xml , você faria algo como:

View view; 
LayoutInflater inflater = (LayoutInflater)   getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
view = inflater.inflate(R.layout.mylayout, null);

RelativeLayout item = (RelativeLayout) view.findViewById(R.id.item);
ccheneson
fonte
4
Eu tenho minha visão principal inflada. O problema é que eu quero inflar parte dele de outro arquivo XML. Este item RelativeLayout faz parte de um layout maior e quero preenchê-lo com o layout de outro arquivo XML.
Michal Dymel
. hum Eu sinto muito, então eu não tenho idéia :( Você está usando algo como <include> em sua tela principal para incluir outro layout?
ccheneson
Não, é um layout simples. Eu acho que apenas adicionarei meus elementos programaticamente - sem XML. Obrigado pela ajuda!
Michal Dymel
27

Embora resposta tardia, mas gostaria de acrescentar que uma maneira de obter isso

LayoutInflater layoutInflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view = layoutInflater.inflate(R.layout.mylayout, item );

onde itemé o layout pai ao qual você deseja adicionar um layout filho.

Shaista Naaz
fonte
(ainda mais tarde) Estou com dificuldades para implementar sua resposta. Tentei o código que você mencionou acima, mas substituiu 'item' por: 'R.layout.activity_layout'. Estou recebendo um "Não há método aplicável para '(int, int)'". Eu poderia incomodá-lo com seus pensamentos?
Kyle
1
@ Kyle - ainda mais tarde. Você não pode usar Rrecursos como referências a um objeto, eles são apenas ints. Você deve usar a findViewByIdtransmissão do Rrecurso e digite convertê-lo no objeto desejado. Então você pode usá-lo em chamadas de função como inflate. (. ie ViewGroup item = (ViewGroup) findViewById(R.layout.activity_layout);... então você pode usar itemcomo acima.)
Pimp Trizkit
Acho que vou usar no RelativeLayoutlugar do ViewGroupmeu exemplo acima, pois você não pode instanciar a classe base ViewGroup. A regra de edição de 5 minutos me pegou. lol
Pimp Trizkit
É possível exibir apenas vista criança esconder pai e
NovusMobile
Obrigado, este método ajudou onde eu não poderia usar o getContext () no exemplo anterior, pois estou usando fragmentos.
RightHandedMonkey 5/13
19

É útil acrescentar a isso, mesmo que seja uma postagem antiga, que se a visualização filho que está sendo inflada a partir do xml for adicionada ao layout de um grupo de visualizações, você precisa chamar inflar com uma pista de que tipo de grupo de visualizações será exibido. para ser adicionado a. Gostar:

View child = getLayoutInflater().inflate(R.layout.child, item, false);

O método inflate está bastante sobrecarregado e descreve essa parte do uso nos documentos. Eu tive um problema em que uma única exibição inflada do xml não estava alinhada corretamente nos pais até que eu fiz esse tipo de alteração.

Maximus
fonte
Por fim, obrigado :) Isso permite adicionar várias visualizações a um único pai, mas sem a necessidade de se preocupar com os LayoutParams - que são lidos no XML. Bom trabalho!
Sabo
13

A maneira ainda mais simples é usar

View child = View.inflate(context, R.layout.child, null)
item.addChild(child) //attach to your item
Ashish Rawat
fonte
Usar View.inflate()é a melhor maneira, não é desnecessário LayoutInflaterou getSystemService(Context.LAYOUT_INFLATER_SERVICE)todo esse incômodo! : D
varun
8

inflação de layout

View view = null;
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
view = inflater.inflate(R.layout.mylayout, null);
main.addView(view);
Happy Singh
fonte
6

Se você não estiver em uma atividade, poderá usar o from()método estático da LayoutInflaterclasse para obter um LayoutInflaterou solicitar o serviço getSystemService()também pelo método de contexto :

LayoutInflater i;
Context x;       //Assuming here that x is a valid context, not null

i = (LayoutInflater) x.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//OR
i = LayoutInflater.from(x);

(Eu sei que faz quase 4 anos, mas ainda vale a pena mencionar)

Juan Cortés
fonte
4

Se você quiser adicionar uma única visualização várias vezes, precisará usar

   layoutInflaterForButton = getActivity().getLayoutInflater();

 for (int noOfButton = 0; noOfButton < 5; noOfButton++) {
        FrameLayout btnView = (FrameLayout) layoutInflaterForButton.inflate(R.layout.poll_button, null);
        btnContainer.addView(btnView);
    }

Se você gosta

   layoutInflaterForButton = getActivity().getLayoutInflater();
    FrameLayout btnView = (FrameLayout) layoutInflaterForButton.inflate(R.layout.poll_button, null);

e

for (int noOfButton = 0; noOfButton < 5; noOfButton++) {
            btnContainer.addView(btnView);
        }

então ele lançará uma exceção de todas as visualizações adicionadas prontas.

John smith
fonte
4

AttachToRoot Definido como True

Apenas pense que especificamos um botão em um arquivo de layout XML com a largura e a altura do layout definidas como match_parent.

<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/custom_button">
</Button>

Neste botão, clique em Evento que podemos definir o código a seguir para aumentar o layout nesta atividade.

LayoutInflater inflater = LayoutInflater.from(getContext());
inflater.inflate(R.layout.yourlayoutname, this);

Espero que esta solução funcione para você.!

Equipe eSparkBiz
fonte
3

Tente este código:

  1. Se você deseja apenas aumentar o seu layout:

View view = LayoutInflater.from(context).inflate(R.layout.your_xml_layout,null); // Code for inflating xml layout
RelativeLayout item = view.findViewById(R.id.item);   

  1. Se você deseja aumentar seu layout no contêiner (layout pai):

LinearLayout parent = findViewById(R.id.container);        //parent layout.
View view = LayoutInflater.from(context).inflate(R.layout.your_xml_layout,parent,false); 
RelativeLayout item = view.findViewById(R.id.item);       //initialize layout & By this you can also perform any event.
parent.addView(view);             //adding your inflated layout in parent layout.

Rohit Mhatre
fonte
2

Eu tive mais dificuldade com esse erro, devido às minhas circunstâncias únicas, mas finalmente encontrei uma solução.

Minha situação: estou usando uma exibição separada (XML) que contém a WebViewe é aberta em uma AlertDialogquando clico em um botão na minha exibição principal de atividades. Mas, de uma forma ou de outra, WebViewpertencia à visualização principal de atividade (provavelmente porque eu extraí o recurso daqui), logo antes de atribuí-lo à minha AlertDialog(como visualização), tive que obter o pai da minha WebView, colocá-la em ViewGroup, em seguida, remova todos os pontos de vista sobre isso ViewGroup. Isso funcionou e meu erro desapareceu.

// set up Alert Dialog box
AlertDialog.Builder alert = new AlertDialog.Builder(this);
// inflate other xml where WebView is
LayoutInflater layoutInflater = (LayoutInflater)this.getSystemService
                (Context.LAYOUT_INFLATER_SERVICE);
View v = layoutInflater.inflate(R.layout.your_webview_layout, null);
final WebView webView = (WebView) v.findViewById(R.id.your_webview_id);

// more code...

.... mais tarde, depois que eu carreguei o meu WebView....

// first, remove the parent of WebView from it's old parent so can be assigned a new one.
ViewGroup vg = (ViewGroup) webView.getParent();
vg.removeAllViews();

// put WebView in Dialog box
alert.setView(webView);
alert.show();
Azurespot
fonte
2

Se você está tentando anexar uma exibição filho ao RelativeLayout? você pode fazer seguindo

RelativeLayout item = (RelativeLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, item, true);
Kasim Rangwala
fonte
1

Com o Kotlin, você pode usar:

val content = LayoutInflater.from(context).inflate(R.layout.[custom_layout_name], null)

[your_main_layout].apply {
    //..
    addView(content)
}
Hasan A Yousef
fonte
-1

Eu usei abaixo o trecho de código para isso e funcionou para mim.

LinearLayout linearLayout = (LinearLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, null);
linearLayout.addView(child);
SFDCCoder
fonte