ukryj menu
SPEC
aktualizacja: 2022-05-23 08:48:53
1. DrawerLayout - menu wysuwane
Zawartość Activity, automatycznie reagująca na swipe right
Zawartość Activity, automatycznie reagująca na swipe right
<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--"Normalna" zawartość ekranu-->
</RelativeLayout>
<!--ListView które będzie stanowić wysuwane menu, max 320 dp szerokości-->
<ListView
android:layout_width="300dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="#ff0000"
/>
</androidx.drawerlayout.widget.DrawerLayout>
kopiuj
<androidx.drawerlayout.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--"Normalna" zawartość ekranu-->
</RelativeLayout>
<!--ListView które będzie stanowić wysuwane menu, max 320 dp szerokości-->
<ListView
android:layout_width="300dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="#ff0000"
/>
</androidx.drawerlayout.widget.DrawerLayout>
kopiuj
a) Załadowanie ListView w Drawerze:
Tworzymy własny ArrayAdapter, jak poprzednio
Uzależniamy ikonę od indeksu w metodzie getView() ArrayAdaptera
b) Metody DrawerLayoutu
automatycznie reaguje na swipe right / left
można też wymusić wysunięcie kodem:
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout)
drawerLayout.openDrawer(GravityCompat.START);kopiuj
2. Potrzebne uprawnienia
Dodaj permission INTERNET i ACCESS_NETWORK_STATE
3. Wykrycie statusu sieci
wstaw funkcję z poniższą zawartością do nowej klasy, np Networking, aby móc ją wykorzystać w różnych miejscach aplikacji
ConnectivityManager connectivityManager
= (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if (networkInfo == null || !networkInfo.isConnected())
{
return false;
}
else{
return true;
}kopiuj
= (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if (networkInfo == null || !networkInfo.isConnected())
{
return false;
}
else{
return true;
}kopiuj
Uwaga: Przetestowanie działania powinno polegać na wyłączeniu WiFi w telefonie podczas pracy aplikacji
W razie braku internetu - alert
4. ProgressDialog
to kontrolka wyświetlana podczas długotrwałych operacji
w klasie
private ProgressDialog pDialog;kopiuj
w onCreate()
pDialog = new ProgressDialog();
pDialog.setMessage("komunikat");
pDialog.setCancelable(false); // nie da się zamknąć klikając w ekrankopiuj
w klasie
private ProgressDialog pDialog;kopiuj
w onCreate()
pDialog = new ProgressDialog();
pDialog.setMessage("komunikat");
pDialog.setCancelable(false); // nie da się zamknąć klikając w ekrankopiuj
show / hide
pDialog.show()
pDialog.dismiss()kopiuj
pDialog.dismiss()kopiuj
5. Upload library
Jest wiele sposobów na wysłanie danych postem (np klasyczny Apache HttpClient)
Jednak najprostsza w użyciu biblioteka to implementacja biblioteki Volley preferowanej przez google
a) w pliku build.gradle (module)
implementation 'com.bikomobile:multipart:1.3.4'kopiuj
implementation 'com.bikomobile:multipart:1.3.4'kopiuj
b) zmiana w AndroidManifest.xml
https://github.com/javierugarte/multipart-android
6. Sharing - wywołanie listy aplikacji, które mogą współdzielić zdjęcie lub inne zasoby
Intent share = new Intent(Intent.ACTION_SEND);kopiuj
typ danych który chcemy współdzielić
share.setType("text/plain"); kopiuj
lokalizacja zapisu
File sdcard = Environment.getExternalStorageDirectory(); kopiuj
przykładowy zapis danych do pliku txt
File file = new File(sdcard, "testshare.txt");
FileWriter writer;
try {
writer = new FileWriter(file);
writer.append("any data");
writer.flush();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
kopiuj
pobierz plik i podziel się nim
share.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:///sdcard/testshare.txt")); kopiuj
pokazanie okna share
startActivity(Intent.createChooser(share, "Podziel się plikiem!")); kopiuj
w tagu <application> wstawiamy
android:usesCleartextTraffic="true" kopiuj
(umożliwia przesyłanie danych tekstowych w post)
oraz
<uses-library android:name="org.apache.http.legacy" android:required="false" />kopiuj
c) na koniec sama funkcjonalność multipartRequest umożliwiająca wysłanie pliku oraz dodatkowych danych post
Multipart multipart = new Multipart(context);
multipart.addFile("image/jpeg", "file", "plik.jpg", imageByteArray);
multipart.launchRequest("upload_url",
response -> {
Log.d("xxx", "success");
},
error -> {
Log.d("xxx", "error");
});kopiuj
multipart.addFile("image/jpeg", "file", "plik.jpg", imageByteArray);
multipart.launchRequest("upload_url",
response -> {
Log.d("xxx", "success");
},
error -> {
Log.d("xxx", "error");
});kopiuj
d) dokumentacja
e) zdjęcie można wysłać w postaci byte[] lub uri, poniżej konwersja file to byte[]
pobranie bitmapy ze ścieżki zdjęcia
bmp = BitmapFactory.decodeFile(fotoPath);kopiuj
konwersja bitmapy na tablicę byte[]
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();kopiuj
bmp = BitmapFactory.decodeFile(fotoPath);kopiuj
konwersja bitmapy na tablicę byte[]
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();kopiuj
6. Sharing - wywołanie listy aplikacji, które mogą współdzielić zdjęcie lub inne zasoby
Intent share = new Intent(Intent.ACTION_SEND);kopiuj
typ danych który chcemy współdzielić
share.setType("text/plain"); kopiuj
lokalizacja zapisu
File sdcard = Environment.getExternalStorageDirectory(); kopiuj
przykładowy zapis danych do pliku txt
File file = new File(sdcard, "testshare.txt");
FileWriter writer;
try {
writer = new FileWriter(file);
writer.append("any data");
writer.flush();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
kopiuj
pobierz plik i podziel się nim
share.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:///sdcard/testshare.txt")); kopiuj
pokazanie okna share
startActivity(Intent.createChooser(share, "Podziel się plikiem!")); kopiuj
w onCreate Activity do share wstaw kod umożliwiający sharowanie zewnętrznych plików przez aplikację
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();kopiuj
StrictMode.setVmPolicy(builder.build());kopiuj
7. SharedPreferences
Android posiada wbudowany mechanizm zapisu prostych danych na urządzeniu
przykład zapisu
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("key", "any string");
editor.commit();kopiuj
zapisane dane można odczytać w innej Activity niż ta w której się zapisały
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
if (preferences.getString("key", null) != null)
Log.d("xxx",preferences.getString("key", null))kopiuj
Android posiada wbudowany mechanizm zapisu prostych danych na urządzeniu
przykład zapisu
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("key", "any string");
editor.commit();kopiuj
zapisane dane można odczytać w innej Activity niż ta w której się zapisały
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
if (preferences.getString("key", null) != null)
Log.d("xxx",preferences.getString("key", null))kopiuj
8. serwer
Express ;-)