【问题标题】:go back to previous fragment from another fragment that was started from recyclerview adapter (xamarin.android)从从 recyclerview 适配器 (xamarin.android) 启动的另一个片段返回到上一个片段
【发布时间】:2021-06-21 05:50:48
【问题描述】:

所以我有一个应用程序如下: 用户输入其凭据的登录页面,如果他的凭据正确,则可以访问主应用程序。如果他选中记住我复选框,他的用户名和密码将保存在共享首选项中,以便他可以在第二次直接进入主应用程序。

主应用程序有一个带有 viewpager 的选项卡式布局。在其中一个选项卡中,它是一个片段,我使用 recyclerview 以行显示从数据库中获取的数据。 现在在每一行中都有一个回复按钮,单击该按钮将显示与每一行对应的详细信息。详细信息将显示在新片段中。

所以关键是我设法在 recyclerview 的适配器中使用此代码将选项卡的片段替换为新片段:

public class recyclerviewAdapter : RecyclerView.Adapter
        {
            // Event handler for item clicks:
            public event EventHandler<int> ItemClick;

            List <summary_request> summary_Requests=new List<summary_request>();
            //Context context;
            public readonly stores_fragment context;

            public recyclerviewAdapter(stores_fragment context, List<summary_request> sum_req)
            {
                this.context = context;
                summary_Requests = sum_req;

            }
            public override RecyclerView.ViewHolder
                   OnCreateViewHolder(ViewGroup parent, int viewType)
            {
                View itemView = LayoutInflater.From(parent.Context).
                            Inflate(Resource.Layout.recycler_view_data, parent, false);

               
                recyclerview_viewholder vh = new recyclerview_viewholder(itemView, OnClick);
                return vh;
            }
            public override void
                  OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
            {
                recyclerview_viewholder vh = holder as recyclerview_viewholder;
                vh.by_user.Text = summary_Requests[position].By;
                vh.warehousename.Text = summary_Requests[position].warehousename;
                vh.project.Text = summary_Requests[position].project;
                vh.operations_note.Text = summary_Requests[position].destination_Note;
                vh.source_Note.Text = summary_Requests[position].source_Note;
                vh.stockType.Text = summary_Requests[position].stockType;
                vh.requestStatus.Text = summary_Requests[position].requestStatus;
                vh.reply.Click += delegate
                {
                    summary_detail_req fragment = new summary_detail_req();
                    var fm = context.FragmentManager.BeginTransaction();
                    fm.Replace(Resource.Id.frameLayout1, fragment);
                    fm.AddToBackStack(null);
                    fm.Commit();
                    int nb = context.FragmentManager.BackStackEntryCount;
                    Toast.MakeText(context.Context, nb.ToString(), ToastLength.Long).Show();

                };

            }

            

            private void Reply_Click(object sender, EventArgs e)
            {
                Toast.MakeText(context.Context, "reply" , ToastLength.Long).Show();
               
            }

            public override int ItemCount
            {
                get { return summary_Requests.Count; }
            }
            // Raise an event when the item-click takes place:
            void OnClick(int position)
            {
                if (ItemClick != null)
                    ItemClick(this, position);
            }
        }

但我的context.FragmentManager.BackStackEntryCount 仍然为零!我不明白。在我的主要活动中,我将此代码用于 backpress 功能:

 stores_fragment.recyclerviewAdapter adapter;
        
        public override void OnBackPressed()
        {

            string userName = pref.GetString("Username", String.Empty);
            string password = pref.GetString("Password", String.Empty);
            if (userName != String.Empty || password != String.Empty && adapter.context.FragmentManager.BackStackEntryCount == 0)
            {

                this.FinishAffinity();
            }
            else
                base.OnBackPressed();
        }

但我没有得到我想要的。这个功能让我脱离了整个应用程序。if 语句的第一部分是因为没有它,当我从主要活动中按下后退按钮时,它会将我带回登录页面,我不希望那样。 我的问题是我应该怎么做来管理我的片段和 backpress 功能? 提前致谢。

【问题讨论】:

    标签: android-fragments android-recyclerview xamarin.android onbackpressed


    【解决方案1】:

    所以关键是我设法使用 recyclerview 的适配器中的这段代码将选项卡的片段替换为新片段

    根据你的描述,你想从recyclerview Button.click打开另一个片段,如果是,请看下面的代码:

    在OnBindViewHolder

      int  selectedindex;
        // Fill in the contents of the photo card (invoked by the layout manager):
        public override void
            OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
        {
            selectedindex =position;
            PhotoViewHolder vh = holder as PhotoViewHolder;
    
            // Set the ImageView and TextView in this ViewHolder's CardView 
            // from this position in the photo album:
            vh.Image.SetImageResource(mPhotoAlbum[position].PhotoID);
            vh.Caption.Text = mPhotoAlbum[position].Caption;
            vh.btnreply.Click += Btnreply_Click;
        }
    

    显示详细的活动。 MainActivity 是 recyclerview 的当前活动。

       private void Btnreply_Click(object sender, EventArgs e)
        {
            Showdetailed(selectedindex);
        }
        private void Showdetailed(int position)
        {
            var intent = new Intent();
    
            intent.SetClass(MainActivity.mac, typeof(DetailsActivity));
            intent.PutExtra("selectedid", position);
            MainActivity.mac.StartActivity(intent);
        }
    

    详细的activity.cs:

     public class DetailsActivity : Activity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
    
            // Create your application here
            var index = Intent.Extras.GetInt("selectedid", 0);
    
            var details = DetailsFragment.NewInstance(index); // Details
            var fragmentTransaction = FragmentManager.BeginTransaction();
            fragmentTransaction.Add(Android.Resource.Id.Content, details);
            fragmentTransaction.Commit();
        }
    }
    

    DetailsFragment.cs:

    public class DetailsFragment : Fragment
    {
        public int ShownPlayId => Arguments.GetInt("selectedid", 0);
        public static DetailsFragment NewInstance(int index)
        {
            var detailsFrag = new DetailsFragment { Arguments = new Bundle() };
            detailsFrag.Arguments.PutInt("selectedid", index);
            return detailsFrag;
        }
    
    
        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            // Use this to return your custom view for this Fragment
            // return inflater.Inflate(Resource.Layout.YourFragment, container, false);
    
            if (container == null)
            {
                // Currently in a layout without a container, so no reason to create our view.
                return null;
            }
    
            var scroller = new ScrollView(Activity);
    
            var text = new TextView(Activity);
            var padding = Convert.ToInt32(TypedValue.ApplyDimension(ComplexUnitType.Dip, 4, Activity.Resources.DisplayMetrics));
            text.SetPadding(padding, padding, padding, padding);
            text.TextSize = 24;
            
            Photo photo =PhotoAlbum.mBuiltInPhotos[ShownPlayId];
            text.Text = photo.Caption;
    
            scroller.AddView(text);
    
            return scroller;
        }
    }
    

    关于实现fragment,大家可以看看:

    https://docs.microsoft.com/en-us/samples/xamarin/monodroid-samples/fragmentswalkthrough/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-26
      • 1970-01-01
      • 2021-12-26
      相关资源
      最近更新 更多