2017-02-09 3 views
2

Я пытаюсь отобразить на экране Snackbar с некоторыми файловыми данными, которые я извлекаю в методе onActivityResult() после съемки.getCurrentFocus() возвращает null

Дело в том, что View, который передается в Snackbar, возвращает null, и я не могу его отобразить.

Это код метода onActivityResult():

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == CAMERA_REQUEST_CODE && resultCode == RESULT_OK) { 
    File f = new File(mCurrentPhotoPath); 

    if (this.getCurrentFocus() != null) 
     Snackbar.make(this.getCurrentFocus(), f.length()/(1024 * 1024) + " MB, " + f.getPath(), Snackbar.LENGTH_INDEFINITE).show(); 
    } 
} 

Любая идея, почему это происходит?

Спасибо!

ответ

3

Это связано с тем, что при вызове другого действия текущий фокус теряется в активности вызывающего абонента, поэтому он имеет значение null.

Как documentation says:

Посмотреть getCurrentFocus()

Вернуться мнение в этом окне that currently has focus, или нуль, если там нет. Обратите внимание, что это не выглядит в любом окне Window.

Вы можете использовать вид корневой вашей деятельности для закусочной:

// Get the root current view. 
View view = findViewById(android.R.id.content); 
Snackbar.make(view, f.length()/(1024 * 1024) + " MB, " + f.getPath(), Snackbar.LENGTH_INDEFINITE).show(); 

UPDATE

Пожалуйста, следует отметить, что

findViewById(android.R.id.content); 

может находиться за навигационной панелью (с задней кнопкой и т. Д.) На некоторых устройствах (но, похоже, на большинстве устройств это не так). Как говорится в https://stackoverflow.com/a/4488149/4758255.

вы можете использовать:

final ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this 
      .findViewById(android.R.id.content)).getChildAt(0); 

Но лучше всего установить идентификатор этой точки зрения в макете XML и использовать этот идентификатор вместо.

Или, как оп сказал, мы можем использовать:

View v1 = getWindow().getDecorView().getRootView(); 
+0

Спасибо за ответ! Извините за поздний ответ, я нашел другое решение для этого. 'View v = getWindow(). GetDecorView(). GetRootView();' Таким образом я получаю корневой вид Activity и передаю его как первый параметр в методе 'Snackbar.make()' –

+0

Нет проблем. Я включил ваше решение в свой ответ. В случае, если кто-то еще сталкивается с той же проблемой. –

0

Вы можете использовать getCurrentFocus() для просмотра в деятельности. вы почти всегда получите представление. Он является нулевым, хотя

Смежные вопросы