Refre sh Фрагмент действия после обновления данных в SQLite Xamarin Android - PullRequest
0 голосов
/ 07 мая 2020

У меня проблема с моей программой Android при обновлении пользовательских данных на Fragment_profile . Fragment_Profile загружает данные профиля пользователя и содержит кнопку обновления, в которой кнопка переходит к действию под названием EditProfileActivity . Пользователи могут технически обновить данные, но после того, как они сохранят обновленные данные, данные по-прежнему не могут быть обновлены. Старые данные все еще появляются. Я пытаюсь обновить sh фрагмент с помощью OnResume () и добавить OnRestart в мои EditProfileActivity.cs и OnPause как во фрагменте, так и в активности, но все равно ничего. Я использую Xamarin Android и разрабатываю его с C#. Для получения дополнительной информации вы можете увидеть, что произошло в формате GIF My issue

Пока я пытался кодировать, и вот мой код. Fragment_profile.cs

public class Fragment_Profile : Android.Support.V4.App.Fragment
    {
        public HomePageActivity m_currentActivity;

        public TextView m_tv_loginname, m_tv_username, m_tv_fullname , m_tv_dob;

        public Boolean isRefreshing = false;

        public override void OnCreate(Bundle aSavedInstanceState)
        {
            base.OnCreate(aSavedInstanceState);
        }

        //public static Fragment_Profile NewInstance(Model.User aCurrentUser)
        public static Fragment_Profile NewInstance()
        {
            var _frag4 = new Fragment_Profile { Arguments = new Bundle() };
            return _frag4;
        }

        public override View OnCreateView(LayoutInflater aInflater, ViewGroup aContainer, Bundle aSavedInstanceState)
        {
            var _ignored = base.OnCreateView(aInflater, aContainer, aSavedInstanceState);
            var view= aInflater.Inflate(Resource.Layout.FragmentProfile, null);

            m_tv_loginname = view.FindViewById<TextView>(Resource.Id.tv_loginname);
            m_tv_username = view.FindViewById<TextView>(Resource.Id.tv_userEmail);
            m_tv_fullname = view.FindViewById<TextView>(Resource.Id.tv_fullname);
            m_tv_dob = view.FindViewById<TextView>(Resource.Id.tv_dob);


            Button _updateProfile = view.FindViewById<Button>(Resource.Id.btnUpdateProfile);

            _updateProfile.Click += _updateProfile_Click;

            m_currentActivity = (HomePageActivity)this.Activity;

            if (m_currentActivity.CurrentUser != null)
            {
                //string  = "Welcome, " + m_currentActivity.CurrentUser.UserName;
                m_tv_loginname.Text = m_currentActivity.CurrentUser.LoginName;
                m_tv_fullname.Text = m_currentActivity.CurrentUser.UserName;
                m_tv_username.Text = m_currentActivity.CurrentUser.UserEmail;
                m_tv_dob.Text = m_currentActivity.CurrentUser.DateOfBirth;
            }

            else
            {
                Toast.MakeText(Activity, "The data is not found!", ToastLength.Short).Show();
                Intent i = new Intent(Context, typeof(MainActivity));
                StartActivity(i);
                this.Activity.Finish();
            }


            return view;
        }

        private void _updateProfile_Click(object sender, EventArgs e)
        {
            Intent i = new Intent(Context, typeof(EditProfileActivity));
            i.PutExtra("loginname", m_currentActivity.CurrentUser.LoginName);
            i.PutExtra("fullname", m_currentActivity.CurrentUser.UserName);
            i.PutExtra("useremail", m_currentActivity.CurrentUser.UserEmail);
            i.PutExtra("dob", m_currentActivity.CurrentUser.DateOfBirth);
            StartActivity(i);
        }

        public override void OnResume()
        {
            base.OnResume();
            if (isRefreshing)
            {
                Fragment fragment = new Fragment_Profile();
                Android.Support.V4.App.FragmentManager fragmentMg = Activity.SupportFragmentManager;
                FragmentTransaction fragmentTrans = fragmentMg.BeginTransaction();
                fragmentTrans.Replace(Resource.Id.content_frame, fragment);
                fragmentTrans.Detach(fragment);
                fragmentTrans.Attach(fragment);
                fragmentTrans.Commit();

                //adapter.notifyDataSetChanged();
            }
        }

        public override void OnPause()
        {
            base.OnPause();
                isRefreshing = true;
        }
    }

Когда пользователь щелкает _updateProfile button, он будет ссылаться на следующее действие, которым является EditProfileActivity. Вот мой EditProfileActivity.cs

 public class EditProfileActivity : Activity, IOnDateSetListener
    {
        public EditText m_editFullName, m_editUsername, m_dob;
        public TextView m_tvEmail;
        public Button m_btnUpdate;
        public Boolean isRefreshing = false;



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

            SetContentView(Resource.Layout.EditProfile);

            m_editFullName = FindViewById<EditText>(Resource.Id.et_editfullName);
             m_editUsername = FindViewById<EditText>(Resource.Id.et_editUserName);
            m_tvEmail = FindViewById<TextView>(Resource.Id.tv_Email);
             m_dob = FindViewById<EditText>(Resource.Id.et_editDob);
            m_btnUpdate = FindViewById<Button>(Resource.Id.btn_updateprofile);

            m_btnUpdate.Click += _btnUpdate_Click;

            m_dob.Click += _dob_Click;

            Bundle extras = Intent.Extras;
            m_editFullName.Text = extras.GetString("loginname");
            m_editUsername.Text = extras.GetString("fullname");
            m_tvEmail.Text = extras.GetString("useremail");
            m_dob.Text = extras.GetString("dob");


        }

        private void _btnUpdate_Click(object sender, EventArgs e)
        {
            try
            {
                Model.User _currentUser = Model.User.CheckEmailUser(m_tvEmail.Text);
                _currentUser.UserName = m_editUsername.Text;
                _currentUser.LoginName = m_editFullName.Text;
                _currentUser.UserEmail = m_tvEmail.Text;
                _currentUser.DateOfBirth = m_dob.Text;

               var _updated =  DBManager.Instance.Update(_currentUser);

                if (_updated > 0)
                {

                    Toast.MakeText(this, "Your account has been succesfully updated!", ToastLength.Long).Show();
                    Finish();
                    OnResume();
                }

                else
                {
                       Toast.MakeText(this, "Failed to update!", ToastLength.Long).Show();
                }

            }

            catch(Exception ex)
            {
                Toast.MakeText(this, ex.ToString(), ToastLength.Short).Show();
            }
        }

        private void _dob_Click(object sender, EventArgs e)
        {
            var _dateTimeNow = DateTime.Now;
            DatePickerDialog _datepicker = new DatePickerDialog(this, this
                , _dateTimeNow.Year, _dateTimeNow.Month, _dateTimeNow.Day);
            _datepicker.Show();
        }

        public void OnDateSet(DatePicker view, int year, int month, int dayOfMonth)
        {
            m_dob.Text = new DateTime(year, month + 1, dayOfMonth).ToShortDateString();
        }

        protected override void OnRestart()
        {
            base.OnRestart();
            if (isRefreshing)
            {
                isRefreshing = false;
                Finish();
            }
        }

        protected override void OnPause()
        {
            base.OnPause();
            if (!isRefreshing)
                isRefreshing = true;
        }


    }

Я также читал некоторые статьи, в которых были те же проблемы, что и у меня, но это все еще сбивает меня с толку и все равно. Я знаю, что это простая вещь, но мне потребовалось несколько дней, потому что я новичок и до сих пор не могу найти решение. У вас есть идеи? Хотите мне помочь? Если вы не против, проверьте мой исходный код, чтобы я знал, чего мне не хватает. Заранее благодарю за помощь!

1 Ответ

0 голосов
/ 07 мая 2020

В вашем фрагменте вы можете переопределить метод OnResume. Если вернуться к фрагменту из Acitivty. вы должны запросить новые данные из БД, а затем установить новое значение для элементов управления во фрагменте.

 public override void OnResume()
        {
            base.OnResume();
            PHName.Text = photoDAO.GetFirstPhotos(Id).PhotoName;
        }

Здесь выполняется GIF.

enter image description here

Вы можете увидеть этот жизненный цикл фрагмента. Каждый раз, когда вы показываете фрагмент, будет выполняться метод OnResume. Вы получаете самые свежие данные из БД, а затем устанавливаете их на страницу Fragment. enter image description here

Вот моя демонстрация.

https://drive.google.com/file/d/11dROKS7TtqAaVYkG8w6ZKpqnQJRBD87E/view

...