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 ?

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).


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

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)


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

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

1
Le recomendamos que proporcione un texto explicativo junto con su código.
HansHirse

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.