You are on page 1of 9

EXPLICATII DESPRE COD SI MODUL DE

FUNCTIONARE/ABORDARE A CODULUI
TWINKLE!

MAIN.CS

1-OnCreateView -Exacat ca la limbajul de programare C unde avem acel “main”,in android aceasta este functia.
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)

2-View v = inflater.Inflate(Resource.Layout.main, container, false);


TextView tv1 = v.FindViewById<TextView>(Resource.Id.textView1);
TextView tv2 = v.FindViewById<TextView>(Resource.Id.textView2);
TextView tv3 = v.FindViewById<TextView>(Resource.Id.textView3);
CheckBox c1 = v.FindViewById<CheckBox>(Resource.Id.checkBox1);
CheckBox c2 = v.FindViewById<CheckBox>(Resource.Id.checkBox2);
ImageView gotosleep = v.FindViewById<ImageView>(Resource.Id.imageView2);

SetTypeface.Normal.SetTypeFace(Context, tv1);
SetTypeface.Normal.SetTypeFace(Context, tv2);
SetTypeface.Italic.SetTypeFace(Context, tv3);

gotosleep.Click += (object sender, EventArgs e) => {


if (c1.Checked && c2.Checked)
((main_container)Activity).setViewPager(2);
};

return v;
}
}
}

3-TextView tv1 = v.FindViewById<TextView>(Resource.Id.textView1);


TextView tv2 = v.FindViewById<TextView>(Resource.Id.textView2);
TextView tv3 = v.FindViewById<TextView>(Resource.Id.textView3);
CheckBox c1 = v.FindViewById<CheckBox>(Resource.Id.checkBox1);
CheckBox c2 = v.FindViewById<CheckBox>(Resource.Id.checkBox2);
ImageView gotosleep = v.FindViewById<ImageView>(Resource.Id.imageView2);

 Toate acestea reprezinta interfata (la resources la layout) .Sunt imaginile care apar pe primul ecran.Sunt mai multe elemente
despre si pentru acestea :text ,imagine,dimensiune etc.
 Fiecare din acele linii de cod are un anumit id c are ajuta la configurarea optima a imaginilor.

FindViewById-Leaga elementul de acolo cu codul

4-SetTypeface.Normal.SetTypeFace(Context, tv1);
SetTypeface.Normal.SetTypeFace(Context, tv2);
SetTypeface.Italic.SetTypeFace(Context, tv3);

 Aici am schimbat fondul iar toata treaba asta este definita in dreapta in SetTypeface.

public static void SetTypeFace (Context context,TextView obj)


{
Typeface tf = Typeface.CreateFromAsset(context.Assets, "Font/NunitoLight-K7dKW.ttf");
obj.SetTypeface (tf,TypefaceStyle.Italic);
}

public static void SetTypeFace (Context context,Button obj)


{
Typeface tf = Typeface.CreateFromAsset(context.Assets, "Font/NunitoLight-K7dKW.ttf");
obj.SetTypeface (tf,TypefaceStyle.Italic);
}

public static void SetTypeFace (Context context,CheckBox obj)


{
Typeface tf = Typeface.CreateFromAsset(context.Assets, "Font/NunitoLight-K7dKW.ttf");
obj.SetTypeface (tf,TypefaceStyle.Italic);
}

 Aici fontul se svhimba foarte usor,cele subliniate reprezinta direct fodul care daca trebuie schimbat il modificam si gata.Se
incarca un fisier pentru a se putea folosii acest font.(Acesta se gaseste la ASSETS,In Font).

5- gotosleep.Click += (object sender, EventArgs e) => {


if (c1.Checked && c2.Checked)
((main_container)Activity).setViewPager(2);
};

 Aici am creat un eveniment adica un fel de buton,se poate observa asta si din liniile de cod de mai sus unde sunt interfatele.Adica
asta:

ImageView gotosleep = v.FindViewById<ImageView>(Resource.Id.imageView2);

 Cand apasam pe el ,verifica doua Check boxu-uri 1 si 2 iar functia asta ((main_container)Activity).setViewPager(2); desparte
aplicatia pe „activitati”
si deschide main_container.

MAIN_CONTAINER.CS
(este cel principal,de aici trebuie sa incepem)

protected override void OnCreate(Bundle savedInstanceState)

1- RequestWindowFeature(Android.Views.WindowFeatures.NoTitle);

 Functia asta daca nu este specificata o sa apara acea bara de sus unde sunt toate notificarile iar daca ea apare este un lucru destul
de deranjant care ne incurca iar aceste doua linii de cod configureaza toata aceasta treaba.Mai pe scurt ,facem asta pentru a avea
FULL SCREEN.

RequestWindowFeature(Android.Views.WindowFeatures.NoTitle);
Window.SetFlags(Android.Views.WindowManagerFlags.Fullscreen, Android.Views.WindowManagerFlags.Fullscreen);

2- SetContentView(Resource.Layout.main_container);

 Functia aceasta selecteaza care din acele layout.uri sa se deschida.

3- SupportActionBar.Hide();
 Aceasta linie ascund acel Action bar adica aceasta:

4- viewPager = FindViewById<ViewPager>(Resource.Id.container);
 Aici este alt element definit pentru View Pager pe care il gasim tot in acele layout.uri

5- mPagerAdapter = new pagerAdapter(SupportFragmentManager);


 Aici este initializarea pentru linia de cod de mai sus.Fara aceasta intializare nu se poate selecta acel layout si nu va functiona.
6- mPagerAdapter.addFragment(new quiz());
mPagerAdapter.addFragment(new main());
mPagerAdapter.addFragment(new sleepplayer());

 Aici am folosit fragmente.Acestea sunt ca si Activitatile doar ca ele ne permit sa avem mai multe ecrane in aceeasi activitate:”
Fragments introduce modularity and reusability into your activity’s UI by allowing you
to divide the UI into discrete chunks”
 Cele de la final sunt „mai multe ecrane” daca pot spune asa

7- Acel viewPager de la 6 conecteaza mai multe ecrane.adica te lasa sa treci de la un ecran la altul.Acesta are nevoie de un adaptor pe care
l.am definit in aceasta linie de cod:

viewPager.Adapter = mPagerAdapter;

8- setViewPager(0);
 Aceasta linie de cod ne permite sa selectam care ecran sa apara,iar in cazul nostru va fi acel”Quiz”

QUIZ

1- View v = inflater.Inflate(Resource.Layout.quiz, container, false);

 Ca si exemplu:avem o lista pe care o scrollam.Noi ca sa punem mai multe lucruri in aceasta lista :imagine, text etc ;trebuie sa
creez un layout diferit iar ca sa folosim acest layout este aceasta functie/clasa inflater.

2- TextView tv1 = v.FindViewById<TextView>(Resource.Id.textView1);


TextView tv2 = v.FindViewById<TextView>(Resource.Id.textView2);
Spinner sp1 = v.FindViewById<Spinner>(Resource.Id.spinner1);
Spinner sp2 = v.FindViewById<Spinner>(Resource.Id.spinner2);
ImageView iv1 = v.FindViewById<ImageView>(Resource.Id.imageView1);

 Aici ca si mai sus alegem elementele din layout si/codul codul.

3- SetTypeface.Normal.SetTypeFace(Context, tv1);
SetTypeface.Normal.SetTypeFace(Context, tv2);

 Aici am schimbat fotul, deoarece dar ar fi peste tot acelasi font nu ara arata bine.

4- List<string> hours = new List<string>() { "01", "02", "02", "03", "04", "05", "06", "07", "08", "09" };
hours.AddRange(Enumerable.Range(10,15).Select(s=>s.ToString()));

 Aici am adaugat o lista si am mai adaugat si elementele din acea lista.Acea lista este folosita la inceputul aplicatiei pentru a putea
completa acest QUIZ dspre care vorbim.Avem doua mici intrebari in care selectam ora la care deobicei ne punem la somn si ora
la care deobicei ne trezim.Acele valori au fost introduse intocmai pentru a putea sa le selectam noi.
5-hours.AddRange(Enumerable.Range(10,15).Select(s=>s.ToString()));

Ce am selectat eu aici se numeste LINQ. „INQ în C# este folosit pentru a lucra cu accesul la date din surse precum obiecte, seturi de date,

SQL Server și XML. LINQ înseamnă Language Integrated Query. LINQ este un API de interogare a datelor cu sintaxe de interogare

asemănătoare SQL. LINQ oferă funcții pentru a interoga datele stocate în cache din tot felul de surse de date.”

6-ArrayAdapter;
ArrayAdapter aa = new ArrayAdapter(Context, Android.Resource.Layout.SimpleSpinnerDropDownItem, hours);

 Acesta creeaza un fel de lista in care „manageriaza „ce se intampla in lista.Exact acelasi lucru face si in alte functii.

7-sp1.Adapter = aa;
sp2.Adapter = aa;

 Aici am dat adaptorul pe care l-am creat.

8-iv1.Click += (object sender, EventArgs e) =>


{
Notifications ntf = new Notifications(Activity, "1", "Demo notificare", "Demo notificare");
((main_container)Activity).setViewPager(1);

 Aici am creat un eveniment pentru IV1 de click genereaza o notificare .E un eveniment de click care verifica daca cele doua
casute de la QUIZ sunt bifate si dupa schimba ecranul care se vede MAIN.CS(cel cu care am inceput aici descrierea ).

SLEEPPLAYER.CS
1-MediaPlayer mp = null;
 Aceasta este functia din android care se ocupa de tot ce tine de muzica,adaugare muzica ,etc(tot ce tine de acest subiect)

2-SensorManager sensorManager;
 Aceasta linie are indatorirea de a se ocupa ce tot ce tine de senzori.Am folosit accelerometrul

3- ImageView playpause = v.FindViewById<ImageView>(Resource.Id.imageView2);


SeekBar playerBar = v.FindViewById<SeekBar>(Resource.Id.seekBar1);
 Aceste doua linii de cod sunt folosite pentru a putea controla si folosii acel start/stop/pauza cand melodia incepe.

4- Android.Net.Uri URI = Android.Net.Uri.Parse(


Activity.GetExternalFilesDir(null).ListFiles()
.Where(w=>w.Path.Contains(".mp3"))
.Select(s=>s.Path)
.ToList()[0]);

 Aici am facut legatura catre fisierul audio .

GetExternalFilesDir=Returneaza in android cand generez aplicatia mai multe foldere.Unul care e special pentru asa ceva si retureaza
fisierele care se termina in mp3.

ToList()[0])=Functia pentru a convertii in lista si returneaza un string unde se afla melodia.

5- sensorManager = (SensorManager) Context.GetSystemService(Context.SensorService);


 Asa se defineste in android functia(sensorManager) cel care se ocupa de senzori.

6- (e.Sensor.Type==SensorType.Accelerometer)
{
ax=e.Values [0];
ay=e.Values [1];
az=e.Values [2];

 Aici citim valorile de la senzor.

7- mp = new MediaPlayer();
mp.SetDataSource(Context, URI);
mp.Prepare();

 Aici am definit ce se ocupa de muzica,media player.

mp.SetDataSource(Context, URI)=Aici am selectat ce melodie sa cante.Acesta se leaga de ce am prezentat mai sus care este calea catre
melodie:

Android.Net.Uri URI = Android.Net.Uri.Parse(


Activity.GetExternalFilesDir(null).ListFiles()
.Where(w=>w.Path.Contains(".mp3"))
.Select(s=>s.Path)
.ToList()[0]);

8- playerBar.Max = mp.Duration / 1000;


 Aici am selectat pana in ce valoare poate sa mearga melodia.

9- playerBar.ProgressChanged += (object sender, ProgressChangedEventArgs e) => {


if (e.FromUser && mp!=null)
{
mp.SeekTo(playerBar.Progress*1000);
}
};

 In cazul in care luam degetulsi muti de acea bara ramane acolo unde o lasam noi.

10- Thread=Un fir este un fir de execuție într-un program. Mașina virtuală Java permite unei aplicații să aibă mai multe fire de execuție
care rulează simultan.

RunOnUiThread=Se foloseste in android atunci cand ai un THREAD si modifica interfata.

int seekCurrentPos = mp.CurrentPosition / 1000;


playerBar.Progress = seekCurrentPos=Aici modificam pozitia pe acel seekbar.

new Thread(()=> {
while (true)
{
Activity.RunOnUiThread(() => {
if (mp != null && (string)playpause.Tag == "1")
{
int seekCurrentPos = mp.CurrentPosition / 1000;
playerBar.Progress = seekCurrentPos;
}
});

Thread.Sleep(1000);

11- }).Start();
playpause.Click += (object sender,EventArgs e) => {
if ((string)playpause.Tag == "0")
{
playpause.SetImageResource(Resource.Drawable.pausebtn);
playpause.Tag = "1";

mp.Start();
} else
{
playpause.SetImageResource(Resource.Drawable.playbtn);
playpause.Tag = "0";

mp.Pause();

 Buton de play si pauza.Schimba imaginea in functie de ce stare are (acele doua bare la play si acel triunghi cand e pe pauza)
 Tot ce aici sunt implementate ca in momentul cand isi schimba starea sa porneasca si /sau opreasca melodia

SPLASH_CONTAINER.CS(este prima pe care o


deschide/o ruleaza deoarece are functia [Activity(MainLauncher = true)] )

1-RequestWindowFeature(Android.Views.WindowFeatures.NoTitle);
Window.SetFlags(Android.Views.WindowManagerFlags.Fullscreen, Android.Views.WindowManagerFlags.Fullscreen);

 Acelasi lucru ca inainte ,sa nu apara bara de notificari.

Are doua activitati aplicatia:Cea de log in si cea in care canta


melodia!!!!!
2-SetContentView(Resource.Layout.splash_container);
 Selecteaza ce layout sa afiseze

3-SupportActionBar.Hide();
 Ascunde action bar

4-mPagerAdapter.addFragment(new splash());
mPagerAdapter.addFragment(new login());

 Aici este adapterul care contine ecranele.

LOGIN(continuare la cel de mai sus deoarece


imediat dupa ce ruleaza el intevine login-ul)

5- View v = inflater.Inflate(Resource.Layout.login, container, false)


 Aici incarc ce layout vreau sa apara

6- ImageView fb_signUp = v.FindViewById<ImageView>(Resource.Id.imageView2);


ImageView b = v.FindViewById<ImageView>(Resource.Id.imageView1);
TextView tv1 = v.FindViewById<TextView>(Resource.Id.textView1);
SetTypeface.Italic.SetTypeFace(Context, tv1);

 Aici am definit elementele care apar in layout

7- b.Click += (object sender, EventArgs e)=>


{
StartActivity(new Intent(this.Context,typeof(main_container)));
};

 Am creat un eveniment care atunci cand este apasat deschide MAIN_CONTAINER.CS

NOTIFICATIONS

1- public Notifications(Context context, string id, string title, string text)


{
NotificationManager nManager = (NotificationManager)context.GetSystemService(Android.Content.Context.NotificationService);

// NotificationChannel mChannel = new NotificationChannel(id,"generalNotification", NotificationImportance.Low);


// nManager.CreateNotificationChannel(mChannel);

Android.Support.V4.App.NotificationCompat.Builder nBuilder = new Android.Support.V4.App.NotificationCompat.Builder(context,


id)
.SetSmallIcon(Resource.Drawable.abc_ab_share_pack_mtrl_alpha)
.SetContentTitle(title)
.SetContentText(text);

nManager.Notify(0, nBuilder.Build());
}

 Aici am implementat tot ce tine de notificariu si de generarea lor pe ecran.Am selectat ce iconita sa avem ,ce titlu si
textul.

PAGERADAPTOR

1- public class pagerAdapter : FragmentStatePagerAdapter


{
private List<Fragment> fragmentList = new List<Fragment>();

public pagerAdapter(FragmentManager fm) : base(fm)


{

public void addFragment(Fragment fragment)


{
fragmentList.Add(fragment);
}

public override int Count => fragmentList.Count;

public override Android.Support.V4.App.Fragment GetItem(int position)


{
return fragmentList[position];
}
}

 El ca si clasa este definit aici.

You might also like