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

问题描述 投票:0回答:1

我有一个片段加载数据的循环列表,但我想根据一些条件转到不同的片段:

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

要么

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

我添加了以下代码来实现这一点,但它不起作用:

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();

它没有切换到错误片段,它只是继续原始片段,我得到一个空白屏幕。

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

android-fragments xamarin.android
1个回答
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();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.