17 Ocak 2021 Pazar

Android Kütüphane Sistemi Mobil Uygulaması - 1

 Merhabalar. Hem Kotlin bilgilerimi pekiştirmek hem de evdeki kişisel kütüphanemi yönetmek için birkaç yazıdan oluşan bir yazı dizisi hazırlayacağım. 

Uygulama bir Android uygulaması olup Kotlin (Java'nın yandan yemişi) dili ile yazılmıştır. Tüm akışlar,daha önceden  Spring Framework ile geliştirdiğim ve bir kütüphanede yapılacak temel işlemleri içeren web servis tarafında idare edilmektedir.

Hem uygulama da hemde web servis tarafında kullandığım teknolojiler ve kütüphaneler aşağıda ki gibidir;

Android

  1. Kotlin
  2. Retrofit (web servis client için)
  3. Glide (Resim dosyalarını bir URL  ' den daha performanslı yüklemek için)
  4. circularimageview (Resimleri yuvarlak bir biçimde göstermek için)
  5. MPAndroidChart (Chart kütüphanesi)
  6. clans.fab (Menu içerikli FloatingActionButton için)
  7. Pierry:SimpleToast (Daha şık bir Toastr için)

Web Servis

  1. Spring Framework

Uygulamaya ait ekran görüntüleri aşağıda ki gibi olup buradan Android uygulamasına , buradan ise web servise ulaşabilirsiniz.



Giriş Ekranı
Kayıt Ekranı
Dashboard





















Ana menü
Kitap Listesi
   
Kitap Filtreleme




















Kitap Detayı
Yorumlar
Profil Düzenleme






















Pıuyıarametreler
Parametre ekleme
Yorumlar





















Bir sonraki yazıda yukarıda ki ekranları kodları ile birlikte anlatarak devam edeceğim. Kalın sağlıcakla...

14 Ekim 2019 Pazartesi

Android Custom Toastr Yapımı


Merhaba.

Bu yazımda sizlere Android’de sıkça kullandığımız Toastr’ın customize edilişi hakkında bilgi vereceğim.

ShowCustomToast metodunda toastr tiplerini dörde ayırarak

1.İnfo
2.Success
3.Warning
4.Error
tiplerine göre toastr’ın iconunu ve layout backgroundunu değiştirdim.

Bu tipler aşağıda ki Enum’da tutulmaktadır.



CustomToastrTypeEnum.java

public enum CustomToastrTypeEnum {
    INFO("INFO","İnfo"),
    WARNING("WARNING","Warning"),
    SUCCESS("SUCCESS","Success"),
    ERROR("ERROR","Error");
    private CustomToastrTypeEnum(String value, String label) {
        this.value = value;
        this.label = label;
    }
    private String value;
    private String label;
    public String getValue() {
        return value;
    }
    public String getLabel() {
        return label;
    }
    public static CustomToastrTypeEnum getEnumByValue(String value) {
        for (CustomToastrTypeEnum k : CustomToastrTypeEnum.values()) {
            if (k.value.equals(value)) {
                return k;
            }
        }
        return null;
    }
    public static CustomToastrTypeEnum getenumByLabel(String label) {
        for (CustomToastrTypeEnum k : CustomToastrTypeEnum.values()) {
            if (k.label.equals(label)) {
                return k;
            }
        }
        return null;
    }
}



Şimdi de custom toastrımız için gerekli olan layout dosyası aşağıdaki gibidir.

toast_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toastLayoutId"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal"
    android:padding="10dp" >
    <ImageView
        android:id="@+id/toast_image"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:contentDescription="@string/app_name"
        android:layout_marginRight="10dp" />
    <TextView
        android:id="@+id/toast_text"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:gravity="center"
        android:textColor="#FFF" />
</LinearLayout>
Bu layouttaki ImageView componenti yukarıda ki 4 tipe göre dinamik bir şekilde değişecek olup hemen yanında ise uyarı mesajımızı gösterecek olan TextView componenti bulunmaktadır.

Bu layout dosyasını kullanan ve Toast mesajını gösteren Java metodu aşağıdaki gibidir.


showCustomToast()
public static void showCustomToast(Context context, String text, CustomToastrTypeEnum type,boolean isLong){
    LayoutInflater inflater = LayoutInflater.from(context);
    View layout = inflater.inflate(R.layout.toast_layout, null);
    ImageView image = image = (ImageView) layout.findViewById(R.id.toast_image);
    LinearLayout linearLayout =(LinearLayout)layout.findViewById(R.id.toastLayoutId);
    switch (type){
        case INFO:
            image.setImageResource(R.drawable.info);
            linearLayout.setBackground(layout.getResources().getDrawable(R.drawable.toast_border_info));
            break;
        case SUCCESS:
            image.setImageResource(R.drawable.checked);
            linearLayout.setBackground(layout.getResources().getDrawable(R.drawable.toast_border_success));
            break;
        case WARNING:
            image.setImageResource(R.drawable.warning);
            linearLayout.setBackground(layout.getResources().getDrawable(R.drawable.toast_border_warning));
            break;
        case ERROR:
            image.setImageResource(R.drawable.error);
            linearLayout.setBackground(layout.getResources().getDrawable(R.drawable.toast_border_error));
            break;
    }
    TextView textV = (TextView) layout.findViewById(R.id.toast_text);
    textV.setText(text);
    Toast toast = new Toast(context);
    toast.setDuration((isLong) ? Toast.LENGTH_LONG : Toast.LENGTH_SHORT);
    toast.setView(layout);
    toast.show();
}
Yukarıda switch-case bloğundan da anlaşılacağı üzere metoda gönderilen CustomToastrTypeEnum parametresine göre layout’un içi şekillenmektedir. Layout ‘un içine setlenen backgroundlat aşağıda ki gibidir.

toast_border_info.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <stroke
        android:width="2dp"
        android:color="#ee777777" />
    <solid android:color="#EE3291F3" />
    <padding
        android:bottom="2dp"
        android:left="20dp"
        android:right="20dp"
        android:top="2dp" />
    <corners android:radius="5dp" />
</shape>
toast_border_success.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <stroke
        android:width="2dp"
        android:color="#ee777777" />
    <solid android:color="#EE4BF163" />
    <padding
        android:bottom="2dp"
        android:left="20dp"
        android:right="20dp"
        android:top="2dp" />
    <corners android:radius="5dp" />
</shape>




toast_border_warning.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <stroke
        android:width="2dp"
        android:color="#ee777777" />
    <solid android:color="#EEEB561E" />
    <padding
        android:bottom="2dp"
        android:left="20dp"
        android:right="20dp"
        android:top="2dp" />
    <corners android:radius="5dp" />
</shape>

toast_border_error.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <stroke
        android:width="2dp"
        android:color="#ee777777" />
    <solid android:color="#EEEC2323" />
    <padding
        android:bottom="2dp"
        android:left="20dp"
        android:right="20dp"
        android:top="2dp" />
    <corners android:radius="5dp" />
</shape>
Bu metodun bir acitivity içerisinde çağırılışı ise aşağıda ki gibidir.

showCustomToast(MainActivity.this,"SUCCESS!",
        CustomToastrTypeEnum.SUCCESS,false);

Bu metodun çağırılması ile toast aşağıda ki gibi olur.




Bir sonraki yazımda görüşmek üzere. Sağlıcakla kalın.

18 Temmuz 2018 Çarşamba

Spring REST ile Angular ng-select component kullanımı


Merhabalar. Bu yazımda sizlere bir Angular componenti olan ng-select ve daha önceden yazdığım bir Spring REST service kullanarak autocomplete olayını göstereceğim.

ng-select componentinin kurulumu, temel kullanımı ve özellikleri hakkında bilgi almak için buraya 

bakabilirsiniz.

Burada gireceğimiz kullanıcı adı değeri sistemde aranıp filtrelenerek bulunduğu takdirde kullanıcı adının yanı sıra bu kullanıcıya ait tüm bilgileri tutan bir array dolacaktır.

Öncelikle Java tarafında ki servis metodum aşağıda ki gibidir.



@RequestMapping(value = "/filtrele" , method = RequestMethod.GET , produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public ResponseEntity<List<KullaniciModel>> filterKullanici(@RequestParam String username){
List<KullaniciModel> filteredKullanici = kullaniciService.kullaniciFiltrele(username);
if(filteredKullanici != null && filteredKullanici.size()>0){
return new ResponseEntity<List<KullaniciModel>>(filteredKullanici,HttpStatus.OK);
}
return new ResponseEntity<List<KullaniciModel>>(HttpStatus.NOT_FOUND);
}



ng-select’in html tarafında kullanımı aşağıda ki gibidir.



<div class="form-group">
<label>Kullanıcı Seçiniz</label>
<ng-select [items]="kullanici | async"
 bindLabel="username"
 placeholder="Kullanıcı Ara"
 [hideSelected]="true"
 [multiple]="true"
 typeToSearchText="Kullanıcı adını yazınız"
 notFoundText="Kullanıcı Bulunamadı"
 [loading]="kullaniciLoading"
 [typeahead]="kullaniciInput"
 [(ngModel)]="selectedUser">
</ng-select>
</div>



Component tarafında ise aşağıda ki gibi kullanılır.



import { Component, OnInit } from '@angular/core';

import { AuthService } from '../../auth/auth.service';
import { Observable, of, Subject,concat } from 'rxjs';
import { catchError, debounceTime, distinctUntilChanged, map, tap, switchMap } from 'rxjs/operators';

@Component({
selector: 'app-rol',
templateUrl: './rol.component.html',
styleUrls: ['./rol.component.css']
})
export class RolComponent implements OnInit {

kullanici: Observable<any>;
kullaniciLoading = false;
kullaniciInput = new Subject<string>();
selectedUser: any[];



constructor(private auhtService: AuthService { }

ngOnInit() {
 this.loadKullanici();
}

private loadKullanici() {
 this.kullanici = concat(
  of([]), // default items
    this.kullaniciInput.pipe(
    debounceTime(200),
    distinctUntilChanged(),
    tap(() => this.kullaniciLoading = true),
       switchMap(term => this.auhtService.getKullaniciFiltrele(term).pipe(
          catchError(() => of([])), // empty list on error
          tap(() => this.kullaniciLoading = false)
       ))
     )
   );
}
}



Angular tarafında Java servisini çağırışım ise aşağıda ki gibidir.

getKullaniciFiltrele(username:string):Observable<any>{

   return this.http.get(this.apiUrl + 'api/kullanici/filtrele?username='+username);
}


Componentin autocomplete kullanımına dair ekran görüntüleri aşağıda ki gibidir.