После декомпиляции вы обнаружите, что в методе createDialog () внутреннего класса SortDialog « HomeActivity $ SortDialog.smali » ссылается на класс Util, чтобы узнать, какую тему украшать AlertDialogBuilder с.
СМАЛИ:
.line 2507
new-instance v0, Landroid/app/AlertDialog$Builder;
iget-object v2, p0, Lcom/sonyericsson/home/HomeActivity$SortDialog;->this$0:Lcom/sonyericsson/home/HomeActivity;
iget-object v3, p0, Lcom/sonyericsson/home/HomeActivity$SortDialog;->this$0:Lcom/sonyericsson/home/HomeActivity;
invoke-virtual {v3}, Lcom/sonyericsson/home/HomeActivity;->getApplicationContext()Landroid/content/Context;
move-result-object v3
invoke-static {v3}, Lcom/sonyericsson/home/bidi/Utils;->getDialogAlertThemeStyle(Landroid/content/Context;)I
move-result v3
invoke-direct {v0, v2, v3}, Landroid/app/AlertDialog$Builder;-><init>(Landroid/content/Context;I)V
или на Java
int i = Utils.getDialogAlertThemeStyle(HomeActivity.this.getApplicationContext());
Затем их класс Utils проверяет сохраненную тему, в которой она будет применяться к SortDialog. Поскольку тема не установлена (как я не знаю?), Она возвращает int с 0 или -1 (не уверен).
public static final int getDialogAlertThemeStyle(Context paramContext)
{
if ((sReflectionOk) && (isRtlAlphabet(paramContext)));
for (int i = sThemeBidiDialogAlert; ; i = sThemeDialogAlert)
return i;
}
public static final boolean isRtlAlphabet(Context paramContext)
{
int i = 0;
if (sReflectionOk);
try
{
Resources localResources = paramContext.getResources();
int j = **sRtlAlphabetField**;
boolean bool = localResources.getBoolean(j);
i = bool;
return i;
}
catch (Resources.NotFoundException localNotFoundException)
{
while (true)
LogUtil.reportError("Bidi", "Get rtl alphabet resource failed", localNotFoundException);
}
}
j - это то, что возвращается, и sRtlAlphabetField не было инициализировано должным образом, я предполагаю
**sRtlAlphabetField** = Class.forName("com.android.internal.R$bool").getField("alphabet_isRtl").getInt(null);
Вы видите, что приведенный выше вызов вызывает идентификатор ресурса Alpx_isRtl, который находится в файле Android R.java модуля запуска. Он не должен возвращать верный идентификатор ресурса, поэтому, когда метод Util возвращает -1? или 0 он не может создать новый экземпляр AlertDialog с заданным параметром int. Простая строка журнала для вывода значения i из класса HomeActivity $ SortDialog или Util покажет вам, что он пытается использовать в качестве значения темы, в любом случае это вероятно gumpf.
Это может быть далеко, но я вполне уверен, что именно поэтому эта проблема возникает, и вы ожидаете, что эта ошибка возникнет в методах onCreate () AddToStageDialog, PickActivityDialog, AddDialog и SortDialog ".
Поскольку все они звонят по одной линии:
int i = Utils.getDialogAlertThemeStyle(HomeActivity.this.getApplicationContext());
Я предполагаю, решение было бы отредактировать классы SMALI для: AddToStageDialog, PickActivityDialog, AddDialog и SortDialog, чтобы они создавали AlertDialog.Builder, используя конструктор, который просто принимает контекст в качестве параметра .
1032 * то есть *
AlertDialog.Builder localBuilder1 = new AlertDialog.Builder(localHomeActivity);
Это может сделать это, но без тематической части вы, возможно, будете охотиться на подобные вызовы повсюду.
Удачи!
Редактировать: Я тестировал это сам, и у меня это работает, отредактированный код smali:
от
invoke-direct {v0, v2, v3}, Landroid/app/AlertDialog$Builder;-><init>(Landroid/content/Context;I)V
до:
invoke-direct {v0, v2}, Landroid/app/AlertDialog$Builder;-><init>(Landroid/content/Context;)V
Сделайте это в классах диалога, которые я упоминал выше, и это решит проблему:)