【问题标题】:How to restore whole view of fragment on back button pressed?如何在按下后退按钮时恢复片段的整个视图?
【发布时间】:2017-08-07 10:21:17
【问题描述】:

我需要第一次从服务器中提取数据。当从另一个fragment 按下返回button 时,应该恢复以前的视图,但不要再次重新创建视图并再次从服务器中提取数据。 我的fragment部分内容如下:

AttendanceFragment.cs

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            .......
            if (savedInstanceState == null)
            {
                rootView = inflater.Inflate(Resource.Layout.AttendanceListview, container, false);
            } 
           .........
           // this is where I get data from WebServer
           GetClassSection(); // I am confused here where to put this method and pull data from server



            listView.ItemClick += OnListItemClick;




            return rootView;
          }

 public override void OnSaveInstanceState(Bundle outState)
    {
        base.OnSaveInstanceState(outState);
        outState.PutString("_dataGotFromServer", dataGotFromServer);
    }

button 登陆到这个fragment 时点击 我已经用这种方式替换了fragment

 public void ReplaceFragment(Context context, Fragment newFragment, string TAG)
    {
        Android.Support.V4.App.FragmentManager fragmentManager = ((FragmentActivity)context).SupportFragmentManager;
        Android.Support.V4.App.FragmentTransaction ft = fragmentManager.BeginTransaction();
        ft.Replace(Resource.Id.HomeFrameLayout, newFragment);
        ft.AddToBackStack(TAG);
        ft.Commit();

    }

BaseAdapter 在这里初始化

 public override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        dataList = new List<DA_ClassSectionAttendance>();
        attendanceAdapter = new AttendanceListAdapter(this.Activity, dataList);


        // Create your fragment here
        //set whether MenuOption show/hide from toolbar
        HasOptionsMenu = true;
    }

并且我的适配器设置在这里

  public override void OnActivityCreated(Bundle savedInstanceState)
    {
        base.OnActivityCreated(savedInstanceState);
       dataGotFromServer = savedInstanceState.GetString("_dataGotFromServer");  // savedInstanceState always gets null here  

        listView.Adapter = attendanceAdapter;
    }

我的数据从服务器中提取并在 ui 中更新

 private async void GetClassSection()
    {
        try
        { ...........

            Activity.RunOnUiThread(async () => {
                await Task.Delay(1 * 100);

                attendanceAdapter.NotifyDataSetChanged();
                progress.Visibility = ViewStates.Gone;
            });

        }
        catch (Java.Lang.Exception e)
        {

        }
    }

谢谢。

【问题讨论】:

    标签: android android-fragments xamarin.android


    【解决方案1】:

    当从另一个片段按下后退按钮时,应该恢复以前的视图,但不要再次重新创建视图并再次从服务器拉数据。

    按下后退按钮时,如果您不想让片段恢复数据并重新创建视图,使用FragmentTransaction.Add() 方法而不是FragmentTransaction.Replace() 将是更好的选择。

    当您使用Replace 方法时,它将替换已添加到容器中的现有片段。这与调用Remove(Fragment) 基本相同,所有当前添加的片段使用相同的containerViewId 添加,然后Add(int, Fragment, String) 使用此处给出的相同参数添加。所以当你想重用一些片段时,你必须考虑恢复数据,它会有点复杂。

    但是当你使用Add 方法时,它会在活动状态中添加一个fragment。这个fragment 也可以选择将其view(如果Fragment.onCreateView 返回非空)放入activity 的容器视图中。这意味着之前的Fragment只是隐藏,当你想显示之前的fragment时,你不用担心如何恢复数据。

    这是我的代码:

    public void ReplaceFragment(Context context, Fragment newFragment, string TAG)
        {
            Android.Support.V4.App.FragmentManager fragmentManager = ((FragmentActivity)context).SupportFragmentManager;
            Android.Support.V4.App.FragmentTransaction ft = fragmentManager.BeginTransaction();
    
            //When you want to show your AttendanceFragment
            if (newFragment == null)
            {
                newFragment = new AttendanceFragment();
            }
            if (newFragment.IsAdded)
            {
                ft.Show(mg);
            }
            else
            {
                newFragment.Add(Resource.Id.HomeFrameLayout, newFragment);
            }
            if (anotherFragmentInstance != null && anotherFragmentInstance.IsAdded)
            {
                ft.Hide(anotherFragmentInstance);
            }
            ft.AddToBackStack(TAG);
            ft.Commit();
        }
    

    【讨论】:

    • @Ishwor Khanal,有什么问题吗?
    【解决方案2】:

    根据this image,在fragment类上试试OnActivityCreated

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-08
      相关资源
      最近更新 更多