根据数据状态切换到不同的片段

时间:2019-02-19 16:11:54

标签: android-fragments xamarin.android

我有一个片段,它加载数据的回收列表,但我希望它根据一些条件转到另一个片段:

  

如果出现问题,请切换到错误片段

  

如果未找到任何内容,请切换到空消息片段

我添加了以下代码来实现此目的,但是它不起作用:

var errorFragment = new ErrorFragment();
var args = new Bundle();

args.PutString("ErrorMessage", "Error Occurred While Loading Data");
errorFragment.Arguments = args;

var transaction = FragmentManager.BeginTransaction();
transaction.Replace(Resource.Id.fragmentContainer, errorFragment);
transaction.Commit();

它不会切换到错误片段,而是继续原始片段,然后出现空白屏幕。

错误片段不在我尝试操作的片段上,不确定是否需要。

1 个答案:

答案 0 :(得分:1)

您遇到问题似乎很奇怪。这可能是一个愚蠢的问题,但是您是否检查了所创建的片段实际上具有可以显示的任何有效内容,而不是它实际上没有显示空(或不可见)片段的情况?

您确实应该使用支持库和Android.Support.V4.App.Fragment和SupportFragmentManager(当然还有AppCompatActivity)。通常,最好保留对当前片段的引用,以便您可以从其父Activity中的任何位置访问其内容。

这是一种替换片段的方法:

protected void ReplaceFragment(global::Android.Support.V4.App.Fragment fragment, int fragmentTargetResId, bool addToBackstack = true, string tag = null)
{
    if (addToBackstack)
        SupportFragmentManager.BeginTransaction().Replace(fragmentTargetResId, fragment, tag).AddToBackStack(tag).Commit();
    else
        SupportFragmentManager.BeginTransaction().Replace(fragmentTargetResId, fragment, tag).Commit();
    SupportFragmentManager.ExecutePendingTransactions();
}

可以这样称呼:

private global::Android.Support.V4.App.Fragment _currentFragment;

_currentFragment = new ErrorFragment();
ReplaceFragment(_currentFragment, Resource.Id.content_container, true, Resource.String.error.ToString());

您还可以使用以下方法从后堆栈中检索片段:

protected Fragment GetFragmentFromBackstack(string tag)
{
    if (string.IsNullOrWhiteSpace(tag)) return null;
    return SupportFragmentManager.FindFragmentByTag(tag);
}

并可以通过以下方式支持片段的向后导航:

// To support using the Fragment Backstack with back press
// Override OnBackPress and have it call this utility method
public void OnBackPressWithFragmentManagement()
{
    if (SupportFragmentManager.BackStackEntryCount > 1)
    {
        // get the fragment to be popped
        SupportFragmentManager.PopBackStackImmediate();
        var entry = SupportFragmentManager.GetBackStackEntryAt(SupportFragmentManager.BackStackEntryCount - 1);
        var frag = SupportFragmentManager.FindFragmentByTag(entry.Name);
        FragmentPoppedOnBack?.Invoke(null, frag);
    }
    else
    {
        if (SupportFragmentManager.BackStackEntryCount == 1)
            SupportFragmentManager.PopBackStackImmediate();
        base.OnBackPressed();
    }
}