Llama a getLayoutInflater () en lugares que no están en actividad

190

¿Qué se necesita importar o cómo puedo llamar al inflador Layout en lugares que no sean actividad?

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();
}

Puedo llamar getLayoutInflatersolo en actividad, ¿es una restricción? ¿Qué sucede si quiero crear un cuadro de diálogo personalizado y quiero inflar la vista para él, o si quiero tener un mensaje Toast con una vista personalizada que se muestra desde un servicio, solo tengo el contexto del servicio? No tengo ninguna actividad. pero quiero mostrar un mensaje personalizado

Necesito el inflador en lugares en el código que no está en la clase de actividad.

Cómo puedo hacer esto ?

Lukap
fuente

Respuestas:

396

Puede usar estas actividades externas: todo lo que necesita es proporcionar un Context:

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

Luego, para recuperar sus diferentes widgets, infla un diseño:

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

EDITAR a partir de julio de 2014

La respuesta de Davide sobre cómo obtenerla LayoutInflateres en realidad más correcta que la mía (aunque todavía es válida).

kaspermoerch
fuente
Genial, pero ahora findViewById no funciona, ¿tienes alguna idea al respecto? inflater.inflate (R.layout.some_layout, (ViewGroup) findViewById (R.id.parent));
Lukap
nop, el método inflater.inflate () no tiene un método sobrecargado con solo un parámetro int, pero supongo que el siguiente podría ser nulo.
Lukap
@kaspermoerch ¿por qué dijiste que la respuesta de David es más correcta?
Rohan Bhatia
1
La respuesta de @RohanBhatia Davides no requiere un casting que el mío sí. Si la llamada a getSystemServicepor alguna razón (poco probable) no devuelve un objeto de tipo, LayoutInflaterentonces mi código causaría una excepción en tiempo de ejecución.
kaspermoerch
Trabajó para mi. Gracias
CodeFluid
261

O ...

LayoutInflater inflater = LayoutInflater.from(context);
Davide
fuente
55
Muy tarde, pero en realidad es una mejor respuesta, ya que la función from también verifica con afirmación que realmente recuperas un inflador y arroja un error de lo contrario, lo que será mucho más fácil de manejar que una excitación de puntero nulo en algún lugar del código. grepcode.com/file/repository.grepcode.com/java/ext/…
Raanan
38
Tan breve, mucho hinchador
Danyal Aytekin
@Davide ¿Esta cita significa que la solución de Kaspermoerch es mejor que la suya? "Nunca se usa directamente. En su lugar, use getLayoutInflater () o getSystemService (Class) para recuperar una instancia estándar de LayoutInflater que ya está conectada al contexto actual y configurada correctamente para el dispositivo en el que se está ejecutando". developer.android.com/reference/android/view/LayoutInflater
Tamás Bolvári
@ TamásBolvári es solo más fácil y claro, de hecho, la implementación interna es la misma que escribe Kaspermoerch.
Davide
11

o

View.inflate(context, layout, parent)

Prakash Nadar
fuente
Esta bien ; sin embargo, con este método, no puedo proporcionar el "attachToRoot" booleano
DenisGL
Se basa en el requisito, si no necesita attachToRoot, este es un método auxiliar conveniente o pase getRootView () como el padre del método.
Prakash Nadar
9

Usando el objeto de contexto puede obtener LayoutInflater a partir del siguiente código

LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
anujprashar
fuente
1
LayoutInflater.from(context).inflate(R.layout.row_payment_gateway_item, null);
Sikander Bakht
fuente
1
Le recomendamos que proporcione un texto explicativo junto con su código.
HansHirse
1
LayoutInflater inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );

¡Use esto en su lugar!

Brian Tompsett - 汤 莱恩
fuente