1

我收到了关于这个特殊异常的报告,它让我很难过,没有任何运气四处寻找它。这个应用程序已经在少数不同的设备上进行了测试,没有任何类似的东西。

奇怪的是,用户第一次运行应用程序时,AlertDialog.Builder会创建并呈现 an,因此AlertDialog.Building很可能是设备上的真实方法。文档还告诉我,它也从 API 级别 1 开始存在。

异常可能是指其他问题吗?

异常发生在运行 2.3.6 的 GT-N7000 Galaxy Note 上。

堆栈跟踪被反混淆:

java.lang.NoSuchMethodError: android.app.AlertDialog$Builder.
at com.slowchop.wifiheat.lib.heat.Filter.void showSubjectDialog(java.lang.String,java.lang.String)(SourceFile:143)
at com.slowchop.wifiheat.lib.heat.Filter.void showChangeAccessPoint()(SourceFile:128)
at com.slowchop.wifiheat.lib.heat.HeatActivity.boolean onOptionsItemSelected(com.actionbarsherlock.view.MenuItem)(SourceFile:475)
at android.support.v4.app._ActionBarSherlockTrojanHorse.boolean onMenuItemSelected(int,com.actionbarsherlock.view.MenuItem)(SourceFile:119)

涉及的方法:

private void showSubjectDialog(String title, final String filter) {
    new AlertDialog.Builder(context, AlertDialog.THEME_HOLO_DARK)
            .setTitle(title)
            .setAdapter(subjectAdapter, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int i) {
                    ListItem item = (ListItem)subjectAdapter.getItem(i);
                    updateFilterFromAlertDialog(dialog, filter, item.id);
                }
            }).show();
}

第 143 行是:

    new AlertDialog.Builder(context, AlertDialog.THEME_HOLO_DARK)

还有另一个堆栈跟踪来自不同的路径,但以showChangeAccessPoint()相同的方式继续调用。在这种情况下,关于的错误AlertDialog.Builder是从另一个调用的AlertDialog.Builder!:

java.lang.NoSuchMethodError: android.app.AlertDialog$Builder.
at com.slowchop.wifiheat.lib.heat.Filter.void showSubjectDialog(java.lang.String,java.lang.String)(SourceFile:143)
at com.slowchop.wifiheat.lib.heat.Filter.void showChangeAccessPoint()(SourceFile:128)
at com.slowchop.wifiheat.lib.heat.Filter$2.void onClick(android.content.DialogInterface,int)(SourceFile:85)
at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:935)
4

2 回答 2

5

我想我刚刚解决了,THEME_HOLO_DARKAPI 级别 11。奇怪的是,在运行 2.3.3(API 级别 10)的设备上尝试它似乎没有问题。

这里提到了一种安全使用它的方法:https ://groups.google.com/forum/?fromgroups#!topic/actionbarsherlock/0yNlvDXObAo

AlertDialog.Builder builder;
try {
    builder =  new AlertDialog.Builder(getActivity(), R.style.Theme.Sherlock.Dialog);
} catch (NoSuchMethodError e) {
    Log.e(TAG, "Older SDK, using old Builder");
    builder =  new AlertDialog.Builder(getActivity());
}

此外,这是代码中唯一使用 THEME_HOLO_DARK 的部分,因此它只发生在那里。我想我在那个阶段正在尝试不同的主题,不小心把它放在那里了。

于 2012-07-15T20:37:48.433 回答
3

https://stackoverflow.com/a/12211522/146167中提到的另一种方式

if (Build.VERSION.SDK_INT > 10)
    builder =  new AlertDialog.Builder(getActivity(), R.style.Theme.Sherlock.Dialog);
else
    builder =  new AlertDialog.Builder(getActivity());
于 2013-04-22T13:57:48.857 回答