сохранить пользователя в системе xamarin android - PullRequest
0 голосов
/ 05 августа 2020

Я создал фрагмент диалога входа в систему, который появляется, когда пользователь запускает приложение android. если учетные данные пользователя верны, он перейдет к основному действию. теперь я добавил флажок, который соответствует «держать меня в системе». я хочу, чтобы, когда пользователь установил флажок при первом входе в систему, он сразу переходил к основному действию при втором входе без необходимости повторять go через диалоговое окно входа в систему. вот мой код:

код для моего фрагмента диалога входа в систему:

 private AlertDialog _dialog;
        CheckBox chbx;
        
        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            View view = inflater.Inflate(Resource.Layout.logindlg, container, false);
            Button button = view.FindViewById<Button>(Resource.Id.button1);
            EditText MyeditText1 = view.FindViewById<EditText>(Resource.Id.editText1);
            EditText MyeditText2 = view.FindViewById<EditText>(Resource.Id.editText2);
             chbx= view.FindViewById<CheckBox>(Resource.Id.checkBox1);
            user.Username = MyeditText1.Text;
            user.Password = MyeditText2.Text;
            button.Click += delegate {
                //set the data to the loginpage
                //mOnLoginInforCompleted.inputLoginInforCompleted(MyeditText1.Text.ToString(), MyeditText2.Text.ToString());
                WSlogin.WebService2 ws = new WSlogin.WebService2();
                ws.LoginAsync(MyeditText1.Text, MyeditText2.Text);
                ws.LoginCompleted += Ws_LoginCompleted;

               
                               
                };


            return view;

        }
        private void Ws_LoginCompleted(object sender, WSlogin.LoginCompletedEventArgs e)

        {


            try
            {

                if (e.Result.ValidUser == true)

                {

                    
                    if (chbx.Checked == true)
                    {
                       
                        ISharedPreferencesEditor edit = user.pref.Edit();
                        edit.PutString("Username", user.Username);
                        edit.PutString("Password", user.Password);
                        edit.Apply();
                    }
                    Toast.MakeText(Application.Context, "login successful", ToastLength.Short).Show();
                    mOnLoginInforCompleted.inputLoginInforCompleted(user.Username, user.Password);
                    Dismiss();

                }

                else


                {
                    //Toast.MakeText(Application.Context, "failed", ToastLength.Short).Show();

                    Context context = this.Context;

                    AlertDialog.Builder alert = new AlertDialog.Builder(context);

                    alert.SetTitle("login failed");

                    alert.SetMessage("Please, check your credentials!");
                    alert.SetPositiveButton("okay", (senderAlert, args) =>
                    {

                        CloseDialog();
                    });
                    _dialog = alert.Create();

                    _dialog.Show();


                }
            }
            catch (System.Reflection.TargetInvocationException exp)
            {
                System.Net.WebException exception = new System.Net.WebException("can't reach server");


                Toast.MakeText(this.Context, "Connection to Server failed", ToastLength.Long).Show();
            }

        }
        private void CloseDialog()
        {
            if (_dialog != null)
                _dialog.Dismiss();
        }
        private OnLoginInforCompleted mOnLoginInforCompleted;
        public void setOnLoginInforCompleted(OnLoginInforCompleted onLoginInforCompleted)
        {
            mOnLoginInforCompleted = onLoginInforCompleted;
        }
}

код для действия с MainLauncher = true

 [Activity(Label = "FreeLineApp", Theme = "@style/AppTheme.NoActionBar", MainLauncher = true, NoHistory = true)]
    public class LoginActivity : AppCompatActivity,OnLoginInforCompleted
    {
        private AlertDialog _dialog;
        public void inputLoginInforCompleted(string userName, string passWord)
        {
            //throw new NotImplementedException();
            StartActivity(new Intent(this, typeof(MainActivity)));
        }

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.layout1);
            //  StartActivity(typeof(MainActivity));
            var current = Connectivity.NetworkAccess;

            if (current == NetworkAccess.Internet)
            {
                string userName = user.pref.GetString("Username", String.Empty);
                string password = user.pref.GetString("Password", String.Empty);
                if (userName == String.Empty || password == String.Empty)
                {
                    MyDialogFragment dialogFragment = new MyDialogFragment();
                    dialogFragment.setOnLoginInforCompleted(this);

                    dialogFragment.Cancelable = false;
                    var SupportFragmentManager = this.FragmentManager;
                    dialogFragment.Show(SupportFragmentManager, "dialog");
                }

                else
                {
                    Intent intent = new Intent(this, typeof(MainActivity));
                    this.StartActivity(intent);
                }

            }
            else
            {
                

                AlertDialog.Builder alert = new AlertDialog.Builder(this);

                alert.SetTitle("Connection failed");

                alert.SetMessage("Please, check your internet Connection!");
                alert.SetNeutralButton("okay", (senderAlert, args) => {

                    alert.Dispose();
                    MyDialogFragment dialogFragment = new MyDialogFragment();
                    dialogFragment.setOnLoginInforCompleted(this);

                    dialogFragment.Cancelable = false;
                    var SupportFragmentManager = this.FragmentManager;
                    dialogFragment.Show(SupportFragmentManager, "dialog");

                });
                _dialog = alert.Create();

                _dialog.Show();
            }
            // Create your application here
        }

       
    }
}

где pref - глобальная переменная в классе user

 public static ISharedPreferences pref = Application.Context.GetSharedPreferences("UserInfo", FileCreationMode.Private);

, но это не сработало. Я запускаю приложение в первый раз, ввожу свои учетные данные и устанавливаю флажок. затем выхожу из приложения и снова запускаю, но ничего не происходит. страница входа появляется снова. что я сделал не так? Простите за длинный пост. заранее спасибо

1 Ответ

0 голосов
/ 06 августа 2020

Из общего кода не видно, что приложение, запускающее второй раз с установленным флажком, в первый раз не работает с logi c может go напрямую на главную страницу.

О методе нажатия кнопки «Войти» здесь:

button.Click += delegate {
            //set the data to the loginpage
            //mOnLoginInforCompleted.inputLoginInforCompleted(MyeditText1.Text.ToString(), MyeditText2.Text.ToString());
            WSlogin.WebService2 ws = new WSlogin.WebService2();
            ws.LoginAsync(MyeditText1.Text, MyeditText2.Text);
            ws.LoginCompleted += Ws_LoginCompleted;                              
            };

Каждый раз, когда вы подключаетесь к серверу для входа в систему, флажок logi c не отображается здесь. Я думаю, что решение , которое вы можете проверить, содержат ли сохраненные пользовательские данные перед входом в систему. Например, следующий пример кода:

if (UserInfo.Username != null && UserInfo.Password != null){

 //go to main page

}else{

    WSlogin.WebService2 ws = new WSlogin.WebService2();
    ws.LoginAsync(MyeditText1.Text, MyeditText2.Text);
    ws.LoginCompleted += Ws_LoginCompleted; 

}
...