Как использовать setUserVisibleHint во Fragment на Android - PullRequest
0 голосов
/ 14 мая 2019

В моем приложении у меня есть BottomNavBar, и я хочу показать fragments при нажатии на элементы этого BottomNavBar!
Для установки этого fragments с BottomNavBar я использовал NavigationGraph компонент!

Я хочу использовать setUserVisibleHint метод для одного из этих fragment, но при показе этого fragment не вызывать setUserVisibleHint!

Мои коды активности для набора fragments до BottomNavBar элементы:

class HomeActivity : BaseActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    setupNavigation()

    }

        private fun setupNavigation() {
        val navController = Navigation.findNavController(this, R.id.homePage_fragmentNavHost)
        NavigationUI.setupWithNavController(homePage_bottomNavBar, navController)
    }

    override fun onSupportNavigateUp() = Navigation.findNavController(this, R.id.homePage_fragmentNavHost).navigateUp()
}

Коды моего фрагмента:

class HomeDashboardFragment : Fragment(){

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_home_dashboard, container, false)
    }

    override fun setUserVisibleHint(isVisibleToUser: Boolean) {
        super.setUserVisibleHint(isVisibleToUser)
        if (isVisibleToUser) {
            Handler().postDelayed({ requireContext().toast("Show") }, 500)
        }
    }
}

Почему бы не работать setUserVisibleHint в fragment?

Ответы [ 5 ]

2 голосов
/ 14 мая 2019

Перед тем как поставить этот код, вы знаете о жизненном цикле фрагмента

 override fun setUserVisibleHint(isVisibleToUser: Boolean) {
        super.setUserVisibleHint(isVisibleToUser)
        if (isVisibleToUser) {
           // post your code
        }
    }

    override fun onStart() {
        super.onStart()
        userVisibleHint = true
    }

Happy Coding ....

0 голосов
/ 08 июля 2019

Поскольку setUserVisibleHint (boolean aBoolean) теперь устарела, для тех, кто все еще хочет знать, когда фрагмент виден, вы все равно можете использовать

 public FragmentTransaction setMaxLifecycle(Fragment fragment, Lifecycle.State state)

либо косвенно с FragmentPagerAdapter (или FragmentStatePagerAdapter) просто используя новый конструктор

MyFPagerAdapter(FragmentManager fm) {
        super(fm ,FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
       //...
}

обратите внимание, что FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT позволяет адаптеру использовать setMaxLifecycle внутренне (через setPrimaryItem) вместо setUserVisibleHint. Следовательно, в реализации вашего фрагмента вам больше не нужно будет использовать

setUserVisibleHint(boolean aBoolean)

но вместо этого onResume () вызывают теперь onResume () будет вызываться только для видимого фрагмента. остальные все равно смогут связаться с onCreateView ().

Прямой путь заключается в использовании setMaxLifeCycle с FragmentTransaction при добавлении или переключении фрагмента, где тогда

setMaxLifecycle(fragment, Lifecycle.State.STARTED);

эквивалентен

setUserVisibleHint(false);

и

setMaxLifecycle(fragment, Lifecycle.State.RESUMED);

эквивалентно

setUserVisibleHint(true);

затем снова прослушать с обратным вызовом Fragment onResume ()

0 голосов
/ 15 июня 2019

Если вы используете Навигация , это может быть не лучшим способом добиться желаемого поведения. Навигация имеет OnDestinationChangedListener Интерфейс, который получает обратный вызов при каждом вызове NavController.getCurrentDestination .

К счастью, вы используете Kotlin, и в HomeActivity вы можете получить что-то вроде:

navController.addOnDestinationChangedListener { _, destination, _ ->
    Handler().postDelayed({ requireContext().toast("Show") }, 500)
}

И вы должны получить желаемый результат.

Если вы новичок в навигации, я бы порекомендовал эту кодовую метку. Он проходит через некоторые основы и может помочь вам начать. Для некоторых из более продвинутых понятий вы можете воспользоваться NavigationAdvancedSample на Github.

Если вы все равно хотите напрямую использовать фрагменты, возможно, было бы более надежным использовать методы жизненного цикла (onStart) над setUserVisibleHint ().

0 голосов
/ 14 мая 2019

Используйте BottomSheetBehavior https://developer.android.com/reference/android/support/design/widget/BottomSheetBehavior для этого типа реализации. Вы также можете использовать BottomSheetDialogFragment.

Для установки определенного поведения используйте этот код, например.

bottomSheetBehavior.setPeekHeight(300);
bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
0 голосов
/ 14 мая 2019
 @Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);

    if (isVisibleToUser){
        if (NetworkUtils.isConnected(getActivity())) {
            callYourApi();
        } 
    }
}
...