Witam,
mam problem ze swoja aplikacja Xamarin android.
Po nacisnieciu przycisku metoda wywoluje event ktory otwiera dialog.
W dialogu wspisujemy dane urzytkownika. Jesli sa poprawne zamyka dialog i zmienia layout na inny.
Jednak po wpisaniu poprawnych danych dialog sie zamyka, ale nie przenosi do kolejneogo layoutu.
Kiedy przyciskam przycisk jeszcze raz przechodzi do dialogu i nie wazne co bym wpisal otwiera layout
Wiem, ze jest cos nie tak z kolejnoscia wywolywania metody, tylko nie wiem jak mam ja zaimplementowac poprawnie.
Tutaj link do repozytorium na gicie: https://github.com/BartusZak/Dziennik-Cwiczen
metoda ktora sie wykonuje przy wcsnieciu przycisku:
//Tworze Click Event dla przyciusku "Zaloguj sie" (wykorzystuje metode anonimową)
mBtZaloguj.Click += (object sender, EventArgs args) =>
{
//Wyswietlanie dilogu do logowania
FragmentTransaction zaloguj_tran = FragmentManager.BeginTransaction();
dialog_zaloguj zalogujDialog = new dialog_zaloguj();
zalogujDialog.Show(zaloguj_tran, "dialog logowania");
zalogujDialog.OnZalogujComplete += ZalogujDialog_OnZalogujComplete;
otworzDziennik();
};
Tutaj metoda ktora powinna wykonac sie na koniec:
//Logowanie zakonczono poprawnie
private void ZalogujDialog_OnZalogujComplete(object sender, OnZalogujEventArgs e)
{
if (dialog_zaloguj.ZalogujSuccess)
{
//SetContentView(Resource.Layout.dziennik_main);
//----------------------------------------------------------------------------------------------
//DZIENNIK
SetContentView(Resource.Layout.dziennik2);
FragmentTransaction transaction = FragmentManager.BeginTransaction();
SlidingTabsFragment fragment = new SlidingTabsFragment();
transaction.Replace(Resource.Id.sample_content_fragment, fragment);
transaction.Commit();
}
}
Tutaj klasa dialog_zaloguj.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using MySql.Data.MySqlClient;
using System.Data;
using Java.Lang;
using System.Threading.Tasks;
namespace LoginSystem
{
#region Event #1
//Tworze własną klasę eventu potrzebna do onclick event
public class OnZalogujEventArgs : EventArgs
{
private string txtEmailZaloguj;
private string txtPasswordZaloguj;
//Wykorzystuje properties, aby moc uzyc zmienne na zewnatrz klasy
public string Email
{
get { return txtEmailZaloguj; }
set { txtEmailZaloguj = value; }
}
public string Password
{
get { return txtPasswordZaloguj; }
set { txtPasswordZaloguj = value; }
}
//Konstruktor ktory jest bazowym konstruktorem
public OnZalogujEventArgs(string email, string password) : base()
{
//Wykorzystuje properties do przypisania (inicjalizacji) wartosci zmiennych
Email = email;
Password = password;
}
}
#endregion
public class dialog_zaloguj : DialogFragment
{
//Zmienne globalne
private EditText txtEmailZaloguj;
private EditText txtPasswordZaloguj;
private Button btnZaloguj;
private ProgressBar mprogressBarZaloguj;
public static bool ZalogujSuccess;
//mySQL database status variable
private TextView txtSysLog;
#region Tworze metodę nadpisującą, ktora wyswietla dialog
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
base.OnCreateView(inflater, container, savedInstanceState);
//Przypisuje plik .axml
var view = inflater.Inflate(Resource.Layout.dialog_zaloguj, container, false);
//Inicjuje zmienne globalne
txtEmailZaloguj = view.FindViewById<EditText>(Resource.Id.txtEmailZaloguj);
txtPasswordZaloguj = view.FindViewById<EditText>(Resource.Id.txtPasswordZaloguj);
btnZaloguj = view.FindViewById<Button>(Resource.Id.btnZaloguj);
txtSysLog = view.FindViewById<TextView>(Resource.Id.XtxtSysLog);
mprogressBarZaloguj = view.FindViewById<ProgressBar>(Resource.Id.progressBarZaloguj);
//Rejestruje onclick event (2x tab generuje metode)
btnZaloguj.Click += btnZaloguj_Click;
return view;
}
#endregion
void btnZaloguj_Click(object sender, EventArgs e)
{
//Co się dzieje po wciśnieciu przycisku "Zaloguj!"
//Widoczny progressbar
mprogressBarZaloguj.Visibility = ViewStates.Visible;
//Wywołuje event
OnZalogujComplete.Invoke(this, new OnZalogujEventArgs(txtEmailZaloguj.Text, txtPasswordZaloguj.Text));
MySqlConnection con = new MySqlConnection("Server=bartuszak.pl;Port=3306;database=android;User Id=android;Password=pJ8AyURCxKqYRpeJ;charset=utf8");
try
{
if (con.State == ConnectionState.Closed)
{
con.Open();
#region Pirwszy sposob "wyluskwania" danych z bazy
// MySqlCommand cmd = new MySqlCommand("SELECT ID FROM Users WHERE User_Email=@email AND User_Password=@pass",con);
// cmd.Parameters.AddWithValue("@email", txtEmailZaloguj);
// cmd.Parameters.AddWithValue("@pass", txtPasswordZaloguj);
// txtSysLog.Text = cmd.GetString(0);
#endregion
/////Drugi sposob
MySqlCommand cmd = new MySqlCommand();
cmd.CommandText = string.Format("SELECT ID,User_FirstName FROM Users WHERE User_Email ='"+txtEmailZaloguj.Text+"' AND User_Password='"+txtPasswordZaloguj.Text+"'");
cmd.Connection = con;
MySqlDataReader reader = cmd.ExecuteReader();
if (reader.Read())
{
ZalogujSuccess = true;
int ID = int.Parse(reader.GetString(0));
string User_FirstName = reader.GetString(1);
//Wyswietlam komunikat o zalogowaniu
txtSysLog.Text = string.Format("Zalogowny jako: {0}\nID: {1}", User_FirstName, ID);
}
else
{
txtSysLog.Text = "Błędne hasło lub email!";
}
reader.Close();
}
}
catch(MySqlException ex)
{
txtSysLog.Text = ex.ToString();
}
finally
{
con.Close();
}
//Ustawiam widocznosc progessbar na Invisible
mprogressBarZaloguj.Visibility = ViewStates.Invisible;
if (ZalogujSuccess)
{
txtSysLog.Text = "Zalogowano";
Dismiss();
}
}
//Tworze inicjalizator do eventu
public event EventHandler<OnZalogujEventArgs> OnZalogujComplete;
//Tworzę metodę nadpisującą, która wykonuję sie przed wyświetleniem dialogu
public override void OnActivityCreated(Bundle savedInstanceState)
{
//Usuwam tytuł okna (przypisuje wartosc invisible);
Dialog.Window.RequestFeature(WindowFeatures.NoTitle);
base.OnActivityCreated(savedInstanceState);
//Przypisuje animacje do dialogu
Dialog.Window.Attributes.WindowAnimations = Resource.Style.dialog_animation;
}
}
}
Wszysto tez wrzucone na gita, link ww.
Błagam, powiedzcie mi w jaki sposob moge zamienic ta metode aby wykonywala sie na koncu, a nie z czego wnioskuje od razu po wcisnieju przycisku :(