Получить текущий фрагмент - получить позицию в ViewPager в public void onPageSelected (конечная позиция int), а затем
public PlaceholderFragment getFragmentByPosition(Integer pos){
for(Fragment f:getChildFragmentManager().getFragments()){
if(f.getId()==R.viewpager && f.getArguments().getInt("SECTNUM") - 1 == pos) {
return (PlaceholderFragment) f;
}
}
return null;
}
SECTNUM - аргумент позиции, назначенный публичному статическому PlaceholderFragment newInstance (int sectionNumber); of fragment
getChildFragmentManager () или getFragmentManager () - зависит от того, как созданные SectionsPagerAdapter
Код изначально написан как комментарий исходного кода ControlThrowable
.
Точно так же, как вы упомянули, вы можете удалить строку, если у вас нет возможности создать пользовательское исключение, расширяющее ControlThrowable
, хотя этот код должен был сказать вам, что не перехватывать и подавлять ControlThrowable
. Если бы код был
try {
// Body might throw arbitrarily
} catch {
case c: ControlThrowable => throw c // propagate
case t: Throwable => log(t) // log and suppress
}
, то было бы легче понять, что код пытается сказать.
К вашему сведению, в scala 2.12 есть ошибка, которую невозможно устранить ControlThrowable
.
import scala.util.control.Breaks
import scala.util.control.ControlThrowable
val b = new Breaks
b.breakable {
try {
for (num <- 1 to 10) {
num match {
case 5 => throw new RuntimeException("5")
case 6 => b.break
case x => println(x)
}
}
} catch {
case c: Throwable => println(c)
}
}
Этот код должен печатать числа до 10, потому что b.break
производит ControlThrowable
, и он подавляется до того, как b.breakable
его получает. Но из-за ошибки он печатает до 5.
Таким образом, используя scala 2.12, ControlThrowable будет распространяться в любом случае. Это не требует линии case c: ControlThrowable => throw c // propagate
. Но для целей миграции Вам не следует так писать.
Фактически, эта ошибка будет исправлена в 2.13.x https://github.com/scala/scala/pull/7413
Это не бесполезно.
Учтите это:
class FooException extends Exception with ControlThrowable
Это будет поймано первым блоком и переброшено, так и не достигнув второго блока. Возможно, это плохая идея - писать подобные исключения, но, когда впервые был представлен ControlThrowable (затем он назывался ControlException), это было нередко в стандартной библиотеке .
Можно утверждать, что причина, по которой вы можете наследовать непосредственно из Throwable
, заключается в том, что система типов Java не имеет способа запретить такое расширение, и что иерархия Throwable
не была разработана для добавления большего количества классов, которые не подклассы Error
или Exception
. Вероятно, это причина того, что такие вещи, как NonLocalReturnException
или BreakException
были первоначально подтипами RuntimeException
, а не напрямую Throwable
.
Другой момент заключается в том, что при введении такого маркера это должен был быть trait
. И снова в системе типов Scala нет способа обеспечить, чтобы классы, которые будут смешиваться в этой черте, были , а не подклассами в Exception
.
Вместе эти два факта означают, что, возможно, исторически существовали подклассы ControlThrowable
(тогда ControlException
), которые являются подклассами Exception
. Имея это в виду, становится ясно, что наборы типов, пойманные в этих двух случаях, не были непересекающимися по замыслу. Да, почти через год после введения ControlException
он был изменен на ControlThrowable
, но в тот момент не было способа обеспечить выполнение всех других (пользовательских) подклассов сделать то же самое переключение.
Еще один философский момент в отношении такого кода, как в этом примере, заключается в том, что даже если в программе нет подтипов ControlThrowable
, которые являются подтипами Exception
, и первый случай действительно не влияет на поведение Во втором случае (как это наиболее вероятно сегодня), он все еще показывает, что разработчик задумался над этой конкретной деталью. И, очевидно, код должен быть написан как для других людей, так и для компьютеров.
Как последнее примечание, сегодня вы, вероятно, должны использовать NonFatal
, который вместо этого включает тест для ControlThrowable
.