Documente Academic
Documente Profesional
Documente Cultură
RAPORTUL STAGIULUI DE
PRACTICĂ
Grupa: P-1841
Chişinău, 2022
Introducere
Realizarea practicii ce precede probele de absolvire vizează formarea și dezvoltarea competențelor
profesionale, accentul instruirii fiind pus pe formarea de competențe în domeniul programării, necesare
integrării profesionale eficiente în vederea obținerii unei cariere de succes ulterioare.
Practica tehnologică este centrată pe elev, creând posibilități de dezvoltare a creativității elevilor, a
gândirii critice, educând personalități social-active, capabile să rezolve problemele pe care le vor întâlni
şi capabile să planifice și organizeze timpul de muncă.
Astfel, pe parcursul desfășurării practicii tehnologice elevii trebuie să acorde o atenție deosebită, în
primul rând, conștientizării elementelor și funcțiilor specifice specialității: dezvoltarea și testarea
aplicației.
Sarcina
Realizarea unei aplicații mobile care va păstra toată informația despre “S.A. REGIA APĂ-CANAL
SOROCA”, tarifele pentru apă/canalizare (pentru populație) și achitarea facturii.
android {
compileSdk 32
defaultConfig {
applicationId "com.example.apc"
minSdk 21
targetSdk 32
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-
optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
2
dependencies {
implementation 'androidx.appcompat:appcompat:1.4.2'
implementation 'com.google.android.material:material:1.6.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
implementation 'com.braintreepayments:card-form:3.1.1'
}
activitymain.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/container"
android:layout_above="@id/bottom_navigation"/>
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
app:menu="@menu/bottom_nav_menu" />
</RelativeLayout>
În continuare am creat noul director de resurse android care este menu, în interiorul căruia am
creat un fișier cu resurse pentru meniu bottom_nav_menu.xml, unde sau adăugat articolele:
Home, Info, Payment.
bottom_nav_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/home"
android:title="Home"
android:icon="@drawable/ic_baseline_home_24"/>
<item android:id="@+id/info"
android:title="Info"
android:icon="@drawable/ic_baseline_info_24"/>
<item android:id="@+id/payment"
android:title="Payment"
android:icon="@drawable/ic_baseline_payment_24"/>
</menu>
3
De asemenea sunt create și pictograme cu ajutorul Vector Asset.
fig.1
fig.2
fig.3
4
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".HomeFragment">
<WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</RelativeLayout>
fragment_info.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".InfoFragment">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Tarife"
android:textSize="25sp"
android:gravity="center"
android:id="@+id/txtInfoFragment"
android:textColor="@color/black"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/txtInfoFragment"
android:padding="10sp"
android:text="Ce reprezintă tariful?"
android:textSize="15sp"
android:textColor="@color/black"
android:background="@color/purple_200"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="489dp"
android:layout_below="@+id/txtInfoFragment"
android:layout_marginTop="31dp"
android:padding="10sp"
android:text="Tariful pentru serviciile publice de alimentare cu apă
potabilă și de canalizare reprezintă o taxă pentru captarea și tratarea apei
brute, transportarea, pomparea și distribuția apei potabile, colectarea,
transportarea și epurarea apelor uzate."
android:textColor="@color/black"
android:textSize="15sp" />
<TextView
android:layout_width="match_parent"
5
android:layout_height="wrap_content"
android:layout_below="@+id/txtInfoFragment"
android:layout_marginTop="147dp"
android:padding="10sp"
android:text="Cum se calculează și se aprobă tarifele?"
android:textColor="@color/black"
android:background="@color/purple_200"
android:textSize="15sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="489dp"
android:layout_below="@+id/txtInfoFragment"
android:layout_marginTop="178dp"
android:padding="10sp"
android:text="Structura şi nivelul tarifelor sunt stabilite astfel
încât să reflecte costul economic al furnizării serviciului; costurile
rezonabile suportate în mod eficient de către S.A. ”Apă-Canal Cahul”
(cheltuieli de exploatare, întreţinere, dezvoltare),
un nivel al rentabilităţii proporţional cu tipul şi riscul activităţii."
android:textColor="@color/black"
android:textSize="15sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="489dp"
android:layout_below="@+id/txtInfoFragment"
android:layout_marginTop="304dp"
android:padding="10sp"
android:text="Tariful pentru apă și canalizare (pentru populație) în
Soroca este de 17,40 lei/m c."
android:textColor="@color/black"
android:textSize="15sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/txtInfoFragment"
android:layout_marginTop="366dp"
android:padding="10sp"
android:text="De ce se modifică tarifele?"
android:textColor="@color/black"
android:background="@color/purple_200"
android:textSize="15sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="489dp"
android:layout_below="@+id/txtInfoFragment"
android:layout_marginTop="396dp"
android:padding="10sp"
android:text="Actualizarea tarifului este necesară pentru a putea, în
primul rînd, întreține și apoi, dezvolta și moderniza serviciul public de
alimentare cu apă potabilă și de canalizare."
android:textColor="@color/black"
android:textSize="15sp" />
</RelativeLayout>
fragment_payment.xml
6
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context="PaymentFragment">
<com.braintreepayments.cardform.view.CardForm
android:id="@+id/card_form"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginStart="9dp"
android:layout_marginTop="9dp"
android:layout_marginEnd="10dp"
android:layout_marginBottom="390dp"
android:hint="Numărul facturii"
android:background="@color/purple_200"
android:textSize="20sp" />
<Button
android:id="@+id/btnBuy"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="10dp"
android:layout_marginLeft="40dp"
android:layout_marginRight="40dp"
android:layout_marginTop="10dp"
android:background="@color/purple_200"
android:text="Achitare"
android:textColor="@android:color/white" />
</RelativeLayout>
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
WebView intview;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_home, container,
7
false);
this.intview.loadUrl("https://www.data2b.md/ro/companies/1003607000120/
societatea-pe-actiuni-regia-apa-canal-soroca");
return rootView ;
}
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_info, container, false);
}
}
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.text.InputType;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.Toast;
import com.braintreepayments.cardform.view.CardForm;
CardForm cardForm;
Button buy;
8
AlertDialog.Builder alertBuilder;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup
container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_payment,
container, false);
cardForm = rootView.findViewById(R.id.card_form);
buy = rootView.findViewById(R.id.btnBuy);
cardForm.cardRequired(true)
.expirationRequired(true)
.cvvRequired(true)
.mobileNumberRequired(true)
.mobileNumberExplanation("SMS este trimis pe acest număr
de telefon")
.setup(getActivity());
cardForm.getCvvEditText().setInputType(InputType.TYPE_CLASS_NUMBER |
InputType.TYPE_NUMBER_VARIATION_PASSWORD);
buy.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (cardForm.isValid()) {
alertBuilder = new
AlertDialog.Builder(getActivity());
alertBuilder.setTitle("Confirm înainte de
achiziționare");
alertBuilder.setMessage("Numărul cardului: " +
cardForm.getCardNumber() + "\n" +
"Data expirării cardului: " +
cardForm.getExpirationDateEditText().getText().toString() + "\n" +
"CVV: " + cardForm.getCvv() + "\n" +
"Numărul facturii: " +
cardForm.getPostalCode() + "\n" +
"Numărul de telefon: " +
cardForm.getMobileNumber());
alertBuilder.setPositiveButton("Confirm", new
DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface
dialogInterface, int i) {
dialogInterface.dismiss();
Toast.makeText(getActivity(), "Vă mulțumim
pentru achiziționare", Toast.LENGTH_LONG).show();
}
});
alertBuilder.setNegativeButton("Anulare", new
DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface
dialogInterface, int i) {
dialogInterface.dismiss();
}
});
AlertDialog alertDialog = alertBuilder.create();
alertDialog.show();
} else {
Toast.makeText(getActivity(), "Vă rugăm completați
cerințele", Toast.LENGTH_LONG).show();
}
9
}
});
return rootView;
}
}
MainActivity.java
package com.example.apc;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.TargetApi;
import android.os.Build;
import android.os.Bundle;
import android.view.MenuItem;
import android.webkit.WebResourceRequest;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.android.material.navigation.NavigationBarView;
BottomNavigationView bottomNavigationView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bottomNavigationView = findViewById(R.id.bottom_navigation);
getSupportFragmentManager().beginTransaction().replace(R.id.container,homeFra
gment).commit();
//BadgeDrawable badgeDrawable =
bottomNavigationView.getOrCreateBadge(R.id.home);
//badgeDrawable.setVisible(true);
//badgeDrawable.setNumber(8);
bottomNavigationView.setOnItemSelectedListener(new
NavigationBarView.OnItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.home:
getSupportFragmentManager().beginTransaction().replace(R.id.container,homeFra
gment).commit();
return true;
case R.id.info:
getSupportFragmentManager().beginTransaction().replace(R.id.container,infoFra
gment).commit();
return true;
10
case R.id.payment:
getSupportFragmentManager().beginTransaction().replace(R.id.container,payment
Fragment).commit();
return true;
}
return false;
}
});
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.apc">
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.ApC">
<activity
android:name=".MainActivity"
android:exported="true"
android:configChanges="orientation|keyboardHidden|screenSize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</manifest>
11
Rezultatul elaborării
fig.4 fig.5
Webografie
https://www.youtube.com/watch?v=OV25x3a55pk
https://www.youtube.com/watch?v=WPAHa2GZIYo&t=530s
https://www.youtube.com/watch?v=7QxBFfkT1g4&t=925s
https://www.codingdemos.com/android-credit-card-form-tutorial/
12