我如何在AlertDialog.Builder中使用反射?

4

我正在使用以下代码创建警告对话框:

AlertDialog.Builder builder = new AlertDialog.Builder(context);

在 Android 3.0 中,警告对话框继承创建它们的活动的主题。您可以通过以下方式创建警告对话框来覆盖此操作:

AlertDialog.Builder builder = new AlertDialog.Builder(context, AlertDialog.THEME_HOLO_DARK);

更多相关内容请点击这里

不幸的是,这会在之前版本的Android上强制关闭。我猜使用反射是答案,但无论我读多少都无法弄清语法。有人能提供一个例子吗?

1个回答

6
我认为使用反射是解决方案,但无论我读多少都无法弄清楚语法。
你可以尝试使用反射。但我不会这样做。
我会使用HoneycombHelper。 这个示例项目也有一个需要针对3.0和非3.0做不同处理的情况,在这种情况下,需要在操作栏中使用自定义View。在3.0之前,您无法调用MenuItem上的getActionView()
因此,在需要自定义View的地方,我会这样做:
    EditText add=null;

    if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB) {
        View v=HoneycombHelper.getAddActionView(menu);

        if (v!=null) {
            add=(EditText)v.findViewById(R.id.title);
        }
    }

    if (add!=null) {
        add.setOnEditorActionListener(onSearch);
    }

在这里,我将getActionView()调用放在HoneycombHelper类的静态方法中:

class HoneycombHelper {
    static View getAddActionView(Menu menu) {
        return(menu.findItem(R.id.add).getActionView());
    }
}

我只在3.0或更高版本上加载HoneycombHelper,因此即使它包含旧版本Android的无效方法调用,也不会出现问题。

在你的情况下,你的HoneycombHelper将有一个gimmeMyBuilderDammit()方法或类似的方法,该方法使用API Level 11构造函数。


这个完美地运行了,谢谢。对于未来的读者,我的HoneycombHelper看起来像这样:`import android.app.AlertDialog; import android.content.Context;class HoneycombHelper { static AlertDialog.Builder getBuilder(Context context) { return(new AlertDialog.Builder(context, AlertDialog.THEME_HOLO_DARK)); } } 调用它的方法是:AlertDialog.Builder builder;if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { builder = HoneycombHelper.getBuilder(context); } else { builder = new AlertDialog.Builder(context); }` - wirbly
1
@Turbo: "相对于反射,使用这种方法有什么缺点吗?" -- 在我看来没有。另外请注意,如果您仍然支持Android 1.x,则只需要使用HoneycombHelper。如果您仅支持Android 2.x及更高版本,则可以引用新的API方法,只要使用Build来防止在旧设备上执行这些语句即可。 - CommonsWare
@CommonsWare 我确实还在支持1.6版本。然而,你用 Build 在2.x及以上版本上进行版本检查的做法让我大跌眼镜。我以前也注意到过这种行为,但一直不确定。在编译时,版本特定的代码是否会被剥离?或者DVM有什么改变,以防止加载未存在的函数? - Tony Chan
1
@Turbo:在1.x版本中,一旦Dalvik加载引用了无法识别的内容的类,它就会失败并抛出“VerifyError”。从Android 2.0开始,Dalvik会等到你实际使用找不到的东西时才抛出“VerifyError”。因此,如果您使用“Build”绕过缺失的内容,那么就没有问题了。 - CommonsWare
1
@Turbo:我知道一本很好的书涵盖了这个。 :-) 除此之外,在这里以及android-developers Google Group的过去内容中也提到过这个。我忘记是否有Android Developers Blog的文章提到它了。 - CommonsWare
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接