Я делаю приложение для 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;
}