Фрагмент транзакции с SetCustomAnimations падает на нажатой спине: у указанного потомка уже есть родитель - PullRequest
0 голосов
/ 03 июня 2019

Я делаю приложение для Android с Xamarin.В одном из моих занятий у меня есть макет фрейма, в который я помещаю фрагменты. В транзакции я использую SetCustomAnimations(), Replace() и AddToBackStack().Когда я нажимаю кнопку «Назад» или вызываю OnBackPressed(), приложение вылетает с исключением:

Java.Lang.IllegalStateException: у указанного дочернего элемента уже есть родительский элемент.Сначала вы должны вызвать removeView () на родительском объекте ребенка.

Если я уберу вызов SetCustomAnimations(), он будет работать, но я не получу анимацию.

Операция:

[Android.App.Activity(Label = "Login")]
public class LoginActivity : AppCompatActivity
{
    private FrameLayout view;

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        view = new FrameLayout(this)
        {
            Id = View.GenerateViewId()
        };

        SetContentView(view);

        SupportFragmentManager.BeginTransaction().Add(view.Id, SelectDomainFragment.Create()).Commit();
    }

    public void ShowFragment(Fragment fragment)
    {
        SupportFragmentManager.BeginTransaction()
            .SetCustomAnimations(Resource.Animation.enter_right, Resource.Animation.exit_left, Resource.Animation.enter_left, Resource.Animation.exit_right)
            .Replace(view.Id, fragment)
            .AddToBackStack(null)
            .Commit();
    }    
} 

SelectDomainFragment:

public class SelectDomainFragment : Fragment
{
    private SelectDomainView view;

    public static SelectDomainFragment Create() => new SelectDomainFragment();

    public override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        view = new SelectDomainView(Context);

        view.CloudButtonClicked += (sender, e) => ToLogin(1);
        view.OnPremButtonClicked += (sender, e) => ToLogin(2);
    }

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) => view;        

    private void ToLogin(int target) => ((LoginActivity)Activity).ShowFragment(LoginFragment.Create(target));
}

LoginFragment:

public class LoginFragment : Fragment
{
    private LoginView view;

    public static LoginFragment Create(int target)
    {
        var args = new Bundle();
        args.PutInt("target", target);

        return new LoginFragment
        {
            Arguments = args
        };
    }

    public override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        view = new LoginView(Context);
    }

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) => view;

}
...