替换片段 - 片段类的新实例未实例化

时间:2016-04-30 04:31:06

标签: c# android android-fragments xamarin

我正在尝试使用以下代码行替换另一个片段:

FragmentTransaction ft = Activity.FragmentManager.BeginTransaction();
            UploadCompleted ucompleted = new UploadCompleted();
            ft.Replace(Resource.Id.CameraFragmentContainer, ucompleted, "uploadcompleted");
            ft.AddToBackStack(null);
            ft.Commit();

该片段正在另一个使用Activity的片段管理器的片段中被替换。问题是,未调用替换片段的OnCreate和OnCreateView方法,并且片段的旧实例(第一次替换它时实例化的片段)得到实例化,这就是为什么我无法传递任何新的替换片段的值。知道我做错了什么吗?我是android开发的新手,所以我对片段的了解并不是很好。

2 个答案:

答案 0 :(得分:1)

根据您的逻辑,应该调用新Fragment的OnCreateOnCreateView。在FragmentTransactionActivity而不是在Fragment级别进行public class ParentActivity:Activity { public void ChangeToUploadCompleted() { FragmentTransaction ft = FragmentManager.BeginTransaction(); UploadCompleted ucompleted = new UploadCompleted(); ft.Replace(Resource.Id.CameraFragmentContainer, ucompleted, "uploadcompleted"); ft.AddToBackStack(null); ft.Commit(); } } public FirstFragment:Fragment { void CaptureCompleted () { ((ParentActivity)Activity).ChangeToUploadCompleted(); } } 是一种很好的做法。在上面的代码片段中,您将从已显示的片段中创建新片段的实例,并将其自身替换为父Activity。这不是推荐的方法。我建议进行以下更改。

{{1}}

这是切换片段的好习惯。这也可以解决您的问题

答案 1 :(得分:0)

ft.Replace(Resource.Id.CameraFragmentContainer, ucompleted, "uploadcompleted");

在这个R.id中你放置在Fragment Activity或者Activity中的布局和UploadCompleted是要替换的Fragment类,所以在FRagmentActivity或ACtivity类中使用xml这样的

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    <LinearLayout
        android:id="@+id/lin"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"/>
    </LinearLayout> 

当您想要替换时使用此

FragmentTransaction ft = Activity.FragmentManager.BeginTransaction();
UploadCompleted ucompleted = new UploadCompleted();
ft.Replace(Resource.Id.lin, ucompleted, "uploadcompleted");
ft.AddToBackStack(null);
ft.Commit();