Android Uygulamalarında Proje yapısı

Selamlar,

Android uygulamaları geliştirirken uygulamanın proje yapısı; kod okunabilirliği, düzenlilik ve kolay bakım açısından çok önemlidir. Proje mimarileri için kullanılan tasarım kalıpları mevcut. MVP veya MVVM tasarım kalıplarını araştırıp kullanabilirsiniz. Ben kendim için bir proje yapısı oluşturdum ve bu gün ondan bahsedeceğim. MVP veya MVVM tasarım kalıplarından bahsetmiyorum, ama oluşturmuş olduğum proje yapısında bu tasarım kalıplarını rahatça kullanabilirsiniz.

Bir birine benzer işler yapan classları aynı klasör altında toplama çalıştım.

proje yapısı

Klasörleri açıklayalım.

Common: içerisinde helper, util, constant sınıflarımızın bulunduğu yardımcı pakettir. Projemizde kullanacağımız ortak sınıfları burada tanımlayabiliriz.

İnfrastructure: Uygulamamızın alt yapısını oluşturan katmandır. Eğer server iletişimli bir uygulama geliştiriyorsanız network sınıflarını burada tanımlayabilirsiniz. Ben retrofit kütüphanesini kullandığım için retrofit sınıflarını burada tanımladım.

Presentation: Bu pakette base sınıfları tanımladım. BaseActivity, BaseFragment, BaseAdapter vs. Uygulamadaki bütün activityler, fragmentleri bu sınıflardan türetiyorum.  Her activityde yazılan kodları base alıp sadece 1 defa yazmış oluyorum.

Screen: Bu pakette ise ekranlarımı barındırıyorum. Main paketinin altında actvity,fragment, adapter, model gibi paketlerim var. Bu paketlerde main activity ile ilgili olan sınıflar barınıyor. Mesela main actvitiy içerisinde  fragmentler kullandıysam bu main in altındaki fragment klasöründe oluyor be BaseFragment ten türüyor.

Kullandığım yapı bu şekilde. İlerleyen zamanlarda daha ayrıntılı yazmayı düşünüyorum. İyi çalışmalar.

 

Reklamlar

Android cihaz id ile çalışmak

Selamlar,
Bazen cihaz için özel işlemler yapmamız gerekebiliyor(banlama, requeste ekleme vb.) Bu işlemler için her cihaza özel cihaz id lerini kullanmamız gerekiyor. Biraz araştırma yaptığımda bunu buldum ve kullanıyorum.

    final TelephonyManager tm = (TelephonyManager) getBaseContext().getSystemService(Context.TELEPHONY_SERVICE);

    final String tmDevice, tmSerial, androidId;
    tmDevice = "" + tm.getDeviceId();
    tmSerial = "" + tm.getSimSerialNumber();
    androidId = "" + android.provider.Settings.Secure.getString(getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);

    UUID deviceUuid = new UUID(androidId.hashCode(), ((long)tmDevice.hashCode() << 32) | tmSerial.hashCode());
    String deviceId = deviceUuid.toString(); 

Cihazın 3 id sini birleştirip o cihaza özel bir id çıkartıyor ve bu id’nin başka bir cihazda olma şansı yok.

İyi çalışmalar.

Android RecyclerView Kullanımı ve Örnek Uygulama

Selamlar,

Android uygulamalarında listeleme işlemleri için kullanılan recyclerview viewını basit şekilde kullanacağız. Listeviewe benzeyen bu view daha kullanışlı ve özelleştirilebilir yapıda. Hem yatay hem dikey scroll edilebilir, içerisindeki nesnelerin yerleşimi için layoutmanager sınıfını kullanmamız gerekiyor. Ben genelde LinearLayoutManager ve GridLayoutManager sınıflarını kullanıyorum.

RecyclerView  için her item in bir layoutu olmak zorunda ve bu nesneyi bir adapter sayesinde veri setine bağlamalıyız. Basit bit örnek yapalım,  futbol takımlarımızı ve kısaca bazı bilgilerini listeleyelim.

Her item için bir tane layout olmalıdır, bizim layoutumuz: row_takim.xml

    
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="5dp"
    android:background="#ffffff">

  <TextView
        android:id="@+id/tv_takim_adi"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="17sp"
        android:textStyle="bold"/>

 <TextView
        android:id="@+id/tv_kurulus_yili"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/tv_takim_adi"
        android:layout_marginTop="5dp"
        android:textSize="17sp"
        android:textStyle="normal"/>

    <TextView
        android:id="@+id/tv_kupa_sayisi"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/tv_takim_adi"
        android:layout_marginTop="5dp"
        android:textSize="17sp"
        android:textStyle="normal"/>

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:layout_below="@+id/tv_kurulus_yili"
        android:layout_marginTop="5dp"
        android:background="#ddd"/>
</RelativeLayout>   

Verilerimiz belirli bir modele göre olacaktır. Model sınıfımızı tanımlayalım. : ModelTakim.java

public class ModelTakim {

    private int id;
    private String takimAdi;
    private String kurulusTarihi;
    private String kupaSayisi;

    public ModelTakim() {
    }

    public ModelTakim(int id, String takimAdi, String kurulusTarihi, String kupaSayisi) {
        this.id = id;
        this.takimAdi = takimAdi;
        this.kurulusTarihi = kurulusTarihi;
        this.kupaSayisi = kupaSayisi;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTakimAdi() {
        return takimAdi;
    }

    public void setTakimAdi(String takimAdi) {
        this.takimAdi = takimAdi;
    }

    public String getKurulusTarihi() {
        return kurulusTarihi;
    }

    public void setKurulusTarihi(String kurulusTarihi) {
        this.kurulusTarihi = kurulusTarihi;
    }

    public String getKupaSayisi() {
        return kupaSayisi;
    }

    public void setKupaSayisi(String kupaSayisi) {
        this.kupaSayisi = kupaSayisi;
    }
}

Verilerimizle RecyclerView nesnesini bağlamak için bir tane adaptera ihtiyacımız var. Adaptrımız: TakimlarAdapter.java

public class TakimlarAdapter extends RecyclerView.Adapter <TakimlarAdapter.ViewHolder>{

    private Context context;
    private List<ModelTakim> listTakim;
    private LayoutInflater inflater;

    //item click için interface kullanıyoruz
    private RecyclerViewItemClickListener recyclerViewItemClickListener;

    public class ViewHolder extends RecyclerView.ViewHolder {
        public TextView tv_takim_adi, tv_kurulus_yili,tv_kupa_sayisi;

        public int position = 0;

        public ViewHolder(View v) {
            super(v);
            //item click için tek tokunuş
            v.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    recyclerViewItemClickListener.onItemClick(v, position);
                }
            });
            //item click için uzun dokunuş
            v.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {

                    recyclerViewItemClickListener.onItemLongClick(v, position);
                    return true;
                }
            });

            //row layoutumuzdaki viewları cast ediyoruz
            tv_takim_adi = (TextView) v.findViewById(R.id.tv_takim_adi);
            tv_kurulus_yili = (TextView) v.findViewById(R.id.tv_kurulus_yili);
            tv_kupa_sayisi = (TextView) v.findViewById(R.id.tv_kupa_sayisi);
        }
    }

    //item click e dokunma özelliği için kullandığımız metot
    public void setOnItemClickListener(RecyclerViewItemClickListener recyclerViewItemClickListener) {
        this.recyclerViewItemClickListener = recyclerViewItemClickListener;
    }


    //yapıcımız
    public TakimlarAdapter(Context context, List list) {
        this.context = context;
        this.listTakim = list;
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }


    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
    {
        View v = inflater.inflate(R.layout.row_takim, parent, false);

        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.position = position;
        holder.tv_takim_adi.setText(listTakim.get(position).getTakimAdi());
        holder.tv_kupa_sayisi.setText(listTakim.get(position).getKupaSayisi());
        holder.tv_kurulus_yili.setText(listTakim.get(position).getKurulusTarihi());
    }

    @Override
    public int getItemCount() {
        return listTakim.size();
    }

}

Item click olaylarını yakalamak için bir tane interface tanıplayıp onun metotlarını ezdik. RecyclerViewItemClickListener.java

public interface RecyclerViewItemClickListener {

    //Tıklama olayında Yakalama
    void onItemClick(View view, int position);

    //Uzun Tıklama Olayında Yakalama
    void onItemLongClick(View view, int position);

}

Modelimiz ve Adapterımız hazır, şimdi MainActivity de verilerimizi dolduralım. MainActivity.java

public class MainActivity extends Activity {

    public RecyclerView recyclerView;
    private TakimlarAdapter adapter;
    private RecyclerView.LayoutManager layoutManager;
    private List<ModelTakim> list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView = (RecyclerView) findViewById(R.id.rc_view);
        init();
    }

    private void init() {
        list = new ArrayList();
        layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        dataLoad();
        adapter = new TakimlarAdapter(this, list);

        adapter.setOnItemClickListener(new RecyclerViewItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                //item click,
                Toast.makeText(MainActivity.this, "Takım : " + list.get(position).getTakimAdi(), Toast.LENGTH_SHORT).show();

            }

            @Override
            public void onItemLongClick(View view, int position) {
                Toast.makeText(MainActivity.this, "Uzun bastın", Toast.LENGTH_SHORT).show();

            }
        });
        adapter.notifyDataSetChanged();
        recyclerView.setAdapter(adapter);
    }

    private void dataLoad() {

        ModelTakim takim1 = new ModelTakim();
        takim1.setId(1);
        takim1.setTakimAdi("Galatasaray");
        takim1.setKurulusTarihi("1905");
        takim1.setKupaSayisi("20");
        list.add(takim1);

        ModelTakim takim2 = new ModelTakim();
        takim2.setId(2);
        takim2.setTakimAdi("Fenerbahçe");
        takim2.setKurulusTarihi("1907");
        takim2.setKupaSayisi("19");
        list.add(takim2);

        ModelTakim takim3 = new ModelTakim();
        takim3.setId(3);
        takim3.setTakimAdi("Beşiktaş");
        takim3.setKurulusTarihi("1903");
        takim3.setKupaSayisi("14");
        list.add(takim3);

        ModelTakim takim4 = new ModelTakim();
        takim4.setId(4);
        takim4.setTakimAdi("Mersin İdman Yurdu");
        takim4.setKurulusTarihi("1925");
        takim4.setKupaSayisi("25");
        list.add(takim4);
        //istediğiniz kadar takım ekleyebilirsiniz.
    }
}

main_activity.xml


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rc_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>
   

Bu şekilde RecyclerView nesnesini kullanabiliriz. Recyclerview ın bir çok özelliği var bu örnek sadece temel olarak listeyi doldurmaktı. İlerleyen yazılarda farklı özelliklerini kullanacağız.

İyi çalışmalar..