2015-07-13 1 views
0

На Android 4.4 и ниже я использую следующий код для setAccessible (истина) и получить контекст для диалога:Альтернатива getDeclaredField («MBase») на Android 5

private Context getOriginalContextForDialog(Dialog dialog) { 
    try { 
     if (dialog == null || (dialog != null && dialog.getContext() == null)){ 
      return null; 
     } 

     Field field = dialog.getContext().getClass().getDeclaredField("mBase"); 

     field.setAccessible(true); 
     Context value = (Context) field.get(dialog.getContext()); 
     return value; 
    } catch (Exception e) { 
     logProc.errSys(LogSubcategory.USER_NOTICE, "Error getting dialog context on UIProcImpl.dismissProgressDialog.", e); 
    } 

    return null; 
} 

Это возвращает исключение в Android 5, потому что «mBase» не найден. Я не могу узнать, что такое эквивалент на Android 5. Я добавил «getDeclaredFields», чтобы узнать, какие значения были возвращены. Прилагаются скриншоты некоторых данных в массиве, возвращаемом из «getDeclaredFields». Я выделил красным цветом на скриншоте из Android 4.4, который показывает «mBase». Другой снимок экрана - от Android 5, и он не включает в себя «mBase».

Что будет эквивалент для «mBase» в Android 5? Или как мне лучше кодировать это, чтобы поддерживать как 4.4, так и 5?

Android 4,4 Android 4.4

Android 5 Android 5

+0

ли смысл о ContextWrapper.getBaseContext()? – krystian71115

+0

'dialog.getContext()' возвращает контекст, почему вы это делаете? – krystian71115

+0

Так что я могу использовать «setAccessible (true). – Mark

ответ

0

Вы можете использовать это, чтобы получить базовый контекст из диалога:

Dialog dialog; // your dialog 
Context context = dialog.getContext(); 
if(context instanceof ContextWrapper) 
{ 
    context = ((ContextWrapper)context).getBaseContext(); 
} 

return context; 

Edit:

Оператор instanceof используется для проверки того, является ли объект экземпляром класса.

Пример:

Context context = dialog.getContext(); 
if(context instanceof ArrayList){ // false because context is not instance of ArrayList 
} 

Object object = context; 
if(object instanceof Context){ // true 

} 
+0

Я унаследовал этот код, поэтому я все еще изучаю, что было сделано и почему. Не нужно «field.setAccessible (true)». – Mark

+0

Вы новичок? – krystian71115

+0

Не новичок в разработке программного обеспечения, а в разработке Android. – Mark