在没有活动的地方调用getLayoutInflater()


189

需要导入什么,或者如何在活动以外的地方调用布局充气机?

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

getLayoutInflater只能在活动中打电话,这是一个限制吗?如果我想创建自定义对话框并为其添加视图,又或者我想让Toast消息具有从服务显示的自定义视图怎么办,我只有服务的上下文但我没有任何活动但我想显示自定义消息。

我在活动类中不在代码中的地方需要充气机。

我怎样才能做到这一点 ?

Answers:


396

您可以使用此外部活动-您只需要提供一个Context

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

然后,要检索不同的小部件,请给布局充气:

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

截至2014年7月

戴维(Davide)关于如何获得的答案LayoutInflater实际上比我的答案更正确(尽管这仍然有效)。


太好了,但是现在findViewById不起作用了,您对此有任何想法吗?inflater.inflate(R.layout.some_layout,(ViewGroup)findViewById(R.id.parent));
2011年

不,inflater.inflate()方法没有仅带有一个int参数的重载方法,但是我想下一个可能为null。
2011年

@kaspermoerch为什么您说David的答案更正确?
罗汉·巴蒂亚

1
@RohanBhatia Davides的答案不需要强制转换。如果由于getSystemService某种原因(不太可能)进行的调用未返回类型的对象,LayoutInflater则我的代码将导致运行时异常。
kaspermoerch

为我工作。谢谢
CodeFluid

260

要么 ...

LayoutInflater inflater = LayoutInflater.from(context);

5
很晚了,但实际上是一个更好的答案,因为from函数还会检查断言,表明您实际上返回了充气器,否则抛出错误-与代码中某处的空指针异常相比,这将更容易处理。grepcode.com/file/repository.grepcode.com/java/ext/...
Raanan

38
所以,简单地说,多打气筒
Danyal艾泰金

@Davide这个说法是否意味着卡巴斯基的解决方案比您的解决方案更好?“永远不要直接使用它。相反,请使用getLayoutInflater()或getSystemService(Class)检索已连接到当前上下文并已针对运行的设备正确配置的标准LayoutInflater实例。” developer.android.com/reference/android/view/LayoutInflater
陶Bolvári

@TamásBolvári只是更加简单明了,实际上内部实现与Kaspermoerch编写的相同。
戴维(Davide)


9

使用上下文对象,您可以从以下代码获取LayoutInflater

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.