findFragmentById возвращает ноль

На самом деле вам повезло - программа, записывающая файл, блокирует его, поэтому вы не можете его открыть. Если он не заблокировал его, вы скопировали бы частичный файл, не имея никакой идеи, что есть проблема.

Когда вы не можете получить доступ к файлу, вы можете предположить, что он все еще используется (еще лучше - попробуйте открыть его в эксклюзивном режиме и посмотрите, не открывает ли кто-нибудь еще его, вместо того, чтобы угадывать из-за отказа File.Copy). Если файл заблокирован, вам придется скопировать его в другое время. Если он не заблокирован, вы можете скопировать его (здесь есть небольшой потенциал для состояния гонки).

Когда это «другое время»? Я не помню, когда FileSystemWatcher отправляет несколько событий на файл - проверьте это, вам может быть достаточно просто проигнорировать событие и ждать другого. Если нет, вы всегда можете настроить время и перепроверять файл за 5 секунд.

29
задан Kar0t 29 April 2014 в 00:15
поделиться

4 ответа

только что узнал мою ошибку.

В моем MainActivity.java я импортировал android.support.v4.app.Fragment;, а в моем LoginFragment.java я импортировал android.app.Fragment;. Я изменил это на то же самое, и теперь fm.findFragmentById(R.id.login_fragment) возвращает правильный фрагмент.

33
ответ дан Kar0t 29 April 2014 в 00:15
поделиться

Ответ Kar0t прекрасно, но это может кому-то помочь. В моем случае у меня был фрагмент внутри фрагмента, и я получил неправильный FragmentManager. Мне просто нужно было позвонить:

getChildFragmentManager()

, а затем просто найти фрагмент как обычно:

fm.findFragmentById(R.id.fragment)
83
ответ дан Community 29 April 2014 в 00:15
поделиться

На самом деле не связано с конкретным вопросом, но связано с получением null на findFragmentById, если вы вызываете findFragmentById сразу после коммита, он вернет ноль или последний фрагмент (перед коммитом), причина в том, что коммит делать асинхронно запрос.

Из документов:

Планирует фиксацию этой транзакции. Фиксация происходит не сразу; это будет запланировано как работа над основным потоком, которая будет сделана в следующий раз, когда поток будет готов.

Если вам нужно немедленно findFragmentById, например, изменить цвет текста строки состояния после добавления фрагмента, позвоните executePendingTransactions() после commit()

getSupportFragmentManager().executePendingTransactions();
//call findFragmentById 
4
ответ дан Pavel Poley 29 April 2014 в 00:15
поделиться

Kotlin

У меня также была проблема, потому что я был в дочернем фрагменте. Я мог бы использовать:

    supportFragmentManager.fragments.forEach {
        it.childFragmentManager.fragments.forEach { fragment ->
            if (fragment is HomeFragment) {
                //do something
            } 
        }

, но один сотрудник оптимизировал его с помощью:

     if( findNavController(R.id.nav_host_fragment).currentDestination?.id == R.id.homeFragment) {
       // do something
   }
0
ответ дан Barbara K 29 April 2014 в 00:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: