检测片段的变化

时间:2018-09-20 20:08:31

标签: c# android android-fragments xamarin.android

如何检测容器的碎片变化?

我在我的应用程序中使用了底部导航视图,并且有多个片段可供用户切换,它们都显示在一个容器中。我想检测片段中的变化,以便可以为每个片段更改工具栏的不同属性,并控制底部导航是否可见。

这是我正在考虑使用的代码,只是在过渡时调用该方法,但是由于我在bottomNavigation和suppoortActionBar上获取了空引用异常,因此它目前无法正常工作。

    public void ChangeInFragment(string fragment)
    {
        bool IsMain = true;

        switch (fragment)
        {
            case "homefrg" :
                IsMain = true;
                break;

            case "favfrg" :
                IsMain = true;
                break;

            case "morefrg":
                IsMain = true;
                break;

            case "splitfrg":
                IsMain = false;
                break;

            case "wattfrg":
                IsMain = false;
                break;

            case "weightfrg":
                IsMain = false;
                break;
        }

        if(IsMain == true)
        {
            bottomNavigation.Visibility = ViewStates.Visible;
            SupportActionBar.SetDisplayHomeAsUpEnabled(false);
            SupportActionBar.SetDisplayShowHomeEnabled(false);
        }
        else
        {
            bottomNavigation.Visibility = ViewStates.Invisible;
            SupportActionBar.SetDisplayHomeAsUpEnabled(true);
            SupportActionBar.SetDisplayShowHomeEnabled(true);
        }
    }

这可能不是最好的方法,但是如果无法检测到片段的变化,有人可以解释为什么底部导航栏和工具栏返回空值吗?

谢谢

1 个答案:

答案 0 :(得分:0)

此功能所需的只是您当前的活动实例以获得当前片段

 public Android.Support.V4.App.Fragment GetVisibleFragment(AppCompatActivity appCompatActivity)
    {
        Android.Support.V4.App.FragmentManager fragmentManager = appCompatActivity.SupportFragmentManager;
        IList<Android.Support.V4.App.Fragment> fragments = fragmentManager.Fragments;
        if (fragments != null)
        {
            foreach (Android.Support.V4.App.Fragment fragment in fragments)
            {
                if (fragment != null && fragment.IsVisible)
                    return fragment;
            }
        }
        return null;
    }