Ligue para getLayoutInflater () em locais fora de atividade


189

O que precisa ser importado ou como posso chamar o inflator de Layout em outros locais que não a atividade?

public static void method(Context context){
    //this doesn't work the getLayoutInflater method could not be found
    LayoutInflater inflater = getLayoutInflater();
    // this also doesn't work 
    LayoutInflater inflater = context.getLayoutInflater();
}

Só consigo ligar getLayoutInflaterem atividade, isso é uma restrição? E se eu quiser criar uma caixa de diálogo personalizada e aumentar o modo de exibição, ou se desejar receber uma mensagem do Toast com uma exibição personalizada exibida em um serviço, só tenho o contexto do serviço e não tenho nenhuma atividade mas quero mostrar uma mensagem personalizada.

Preciso do inflador em lugares do código que não estão na classe de atividade.

Como posso fazer isso ?

Respostas:


396

Você pode usar essas atividades externas - tudo que você precisa é fornecer Context:

LayoutInflater inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );

Em seguida, para recuperar seus diferentes widgets, você aumenta o layout:

View view = inflater.inflate( R.layout.myNewInflatedLayout, null );
Button myButton = (Button) view.findViewById( R.id.myButton );

EDIT em julho de 2014

A resposta de Davide sobre como obter o resultado LayoutInflateré realmente mais correta que a minha (que ainda é válida).


Ótimo, mas agora o findViewById não funciona, você tem alguma idéia sobre isso? inflater.inflate (R.layout.some_layout, (ViewGroup) findViewById (R.id.parent));
Lukap 18/10/11

Não, o método inflater.inflate () não tem método sobrecarregado com apenas um parâmetro int, mas acho que o próximo pode ser nulo.
Lukap 18/10/11

@kaspermoerch Por que você disse que a resposta de David é mais correta?
Rohan Bhatia

1
A resposta de @RohanBhatia Davides não exige que a mina seja lançada. Se, getSystemServicepor algum motivo (improvável), a chamada não retornar um objeto do tipo LayoutInflater, meu código causaria uma exceção de tempo de execução.
kaspermoerch

Trabalhou para mim. Obrigado
CodeFluid

260

Ou ...

LayoutInflater inflater = LayoutInflater.from(context);

5
Muito tarde, mas na verdade uma resposta melhor, pois a função from também verifica com afirmação de que você realmente recebe um inflador de volta e gera um erro caso contrário - o que será muito mais fácil de lidar com uma exceção de ponteiro nulo em algum lugar do código. grepcode.com/file/repository.grepcode.com/java/ext/…
Raanan (

38
Tão breve, muito
insuflador

@ David Esta citação significa que a solução da Kaspermoerch é melhor que a sua? "Ele nunca é usado diretamente. Em vez disso, use getLayoutInflater () ou getSystemService (Class) para recuperar uma instância padrão de LayoutInflater que já esteja conectada ao contexto atual e configurada corretamente para o dispositivo em que você está executando." developer.android.com/reference/android/view/LayoutInflater
Tamás Bolvári

@ TamásBolvári É apenas mais fácil e claro, na verdade a implementação interna é a mesma que a gravação do Kaspermoerch.
Davide

11

ou

View.inflate(context, layout, parent)


Isso é bom ; No entanto, com este método, não posso fornecer o "attachToRoot" boolean
DenisGL

Ele é baseado no requisito, se você não precisar de attachToRoot, esse é um método auxiliar conveniente ou transmite getRootView () como pai do método.
Prakash Nadar

9

Usando o objeto de contexto, você pode obter o LayoutInflater a partir do código a seguir

LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

1
LayoutInflater.from(context).inflate(R.layout.row_payment_gateway_item, null);

1
Você é incentivado a fornecer algum texto explicativo junto com o seu código.
HansHirse 28/03/19

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.