Kayıt Ol

Giriş

Şifremi Kaybettim

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Giriş

Kayıt Ol

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi adipiscing gravdio, sit amet suscipit risus ultrices eu. Fusce viverra neque at purus laoreet consequa. Vivamus vulputate posuere nisl quis consequat.

Android ListView Fragment ( Telefon Rehberi Uygulaması )

Merhaba arkadaşlar, bu dersimizde sizlere Fragment lar kullanarak ListView aracılığıyla telefon rehberi uygulaması nasıl yapılır anlatacağım. Android 3.0 ile birlikte android dünyasına giren Fragment lar dinamik yapısı sayesinde olukça kolay ve hızlı bir kullanım olanağını bizlere sunmaktadır. Bu derste de sayfa yapılarımızı fragment lar kullanarak oluşturacağız.

NOT: Bu dersimizde ki uygulamamızdan bir kaç ekran görüntüsü aşağıdadır. Gerçek telefon numaraları çekildiği için kişilerin telefon numaraları gizlenmiştir.

get_contactsScreenshot_2015-11-01-01-02-39Screenshot_2015-11-01-01-03-09

 

 

 

 

 

 

Telefonda yer alan rehberden kişileri çekeceğimiz için öncelikle bu izini vermemiz gerekmektedir AndroidManifest.xml de.

Şimdi ise kodlama yapımızı oluşturmaya başlayalım rehberden isimleri ve telefon numaralarını alacağımız için iki adet parametresi bulunan, PersonInfo adını verdiğimiz sınıfı oluşturalım. Aşağıdaki gibi bir yapı kurmanız işinizi kolaylaştıracaktır. Gördüğünüz gibi name parametresi ismi , phoneNumber parametresi de telefon numarasını tutacak. get methodlarını ve bir adet de Constructor yapısı kullandık.

PersonInfo.java

Şimdi de ListView de hangi itemlerin ne şekilde durmasını istiyorsak onları ayarlıyoruz. Aşağıdaki layout yapısında gördüğünüz gibi iki adet TextView parametresi alt alta olacak şekilde, ve yanlarında iki adet ImageButton yer alacak şekilde ayarlıyoruz. ListView de yer alacak itemleri istediğiniz gibi konumlandırabilirsiniz ben bu dersimizde rehberde yer alan kişinin ismi ile numarasını alt alta duracak şekilde ayarladım , yanlarında ise arama yapabilmesi için bir ImageButton , sms gönderebilmesi için de başka bir ImageButton kullandım.

listview_item.xml

ListView i oluşturmamız için bir adaptera ihtiyacımız var şimdide ListviewAdapter isimli yapımıza bakalım. Bu adapter sınıfımız ile ilgili gerekli açıklamaları kod kısmında yorum şeklinde yaptım. Burada en önemli yapı setClickListeners ile setTagsToViews isimlerini verdiğim fonksiyonlardır. Çoğu zaman Listview içinde yer alan ImageButton lara tıklama eventini adapter içinde yaratılırken verildiğini göreceksiniz fakat bu yanlış bir yaklaşımdır çünkü Adapter sınıfının asıl görevi ; bir yapının oluşturulmasına yardımcı olmaktır. Tıklanma olayını hangi sayfada gerçekleştirmek istiyorsak o sayfada yapmamız gerekmektedir. İşte bu yüzden adapter sınıfımızda her iki ImageButton içinde tıklanma olayını handle edebilmemiz için tag ler ile atama yaptık.

setClickListeners  ile hangi view e tıklandığını belirttik.

setTagsToViews ile hangi view e tıklanıyorsa onun tag ine position verdik. ( position listview de kullanıcı hangi iteme tıklıyorsa o itemin kaçıncı item olduğunu belirlemek için kullandık )

ListviewAdapter.java

MainActivity mize bağlı olan layout kısmını inceleyecek olursak eğer ; burada id sini blank_fragment olarak verdiğimiz bir FrameLayout olduğunu göreceksiniz. Bu yapıyı fragment ları kullanabilmek için yarattık.

activity_main.xml

Görsel kısımlarıda bitirdiğimize göre şimdi MainActivity yani uygulamamızın ilk çalıştığı yere bakalım ; aşağıdaki kod da gördüğünüz gibi ListViewFragment adlı fragment yapımızı oluşturup sayfamıza o fragmentı ekliyoruz. Ayrıca onBackPressed fonksiyonu ile uygulamada geri tuşuna basıldığı anda fragment ın bir önceki fragment ına gelmesini sağlıyoruz. Fragment ların kontrolunu tek bir Activity üzerinden yaptığımız içinde geri tuşuna basıldığı anda yapılması gereken kontrolü burada yapıyoruz.

Şimdi de ListViewFragment adlı fragment yapımıza bakalım ;

Aşağıdaki kod da gördüğünüz gibi Fragment yapısından türettiğimiz ve adını ListViewFragment verdiğimiz bir yapı oluşturduk bu yapıda , onCreateView kısmında , buton ve listview i oluşturduk , butona tıklandığı anda ise list yapımızı kontrol ediyoruz eğer boş ise ; FetchAsyncTask adını verdiğimiz AsyncTask yapısını çalıştırıyoruz.  Telefonda bir çok telefon numarası kayıtlı olabilir ve bu veri çekme işlemlerinin arka planda yapılması en doğrusudur. bu yüzden AsyncTask yapısını oluşturduk. onPreExecute methodun da kullanıcıya Yükleniyor.. mesajını verdik, doInBackground methodun da ise ; ilk önce Cursor yapısı ile Contacts kısmına ulaştık , cursor dan aldığımız değer eğer 0 dan büyük ise kayıtlı kişiler var demektir o zaman while döngüsü ile cursor umuzu ilerlettik daha sonra kişilerin ID sini ve DISPLAY_NAME değerlerini aldık. ID telefonda her kayıtlı olan kişiye karşılık gelir ,  DISPLAY_NAME ise kişinin, telefonda hangi isim ile kaydedilmiş ise onu almamıza yardımcı olur. Yine cursor yardımı ile kişinin telefon numarası olup olmadığını kontrol ediyoruz if ile ve içeri giriyoruz. Burada ise biraz önce almış olduğumuz id ye karşılık gelen telefon numarasını alıyoruz ; en sonunda ise almış olduğumuz isim ile telefon numarasını , PersonInfo tipinde oluşturduğumuz List içine atıp return ile fırlatıyoruz. Zaten fırlattığımız veri onPostExecute yapısına düşüyor ve orada adapterımızı set ediyoruz.

onActivityCreated fonksiyonda var olan listview imizi tekrardan çağırıp var olan adapter ımıza set ediyoruz bu işlem önemli çünkü  bu fragment dan başka bir fragmenta geçip geri gelmeye çalıştığımızda listview in sıfırlandığını ve ekranda çektiğimiz verilerin olmadığını göreceksiniz eğer bu yapıyı kullanmazsanız. Butona bastığımız anda bir kere rehberden kişileri ve numaralarını çekiyoruz ve çektiğimiz veriyi bir daha çekmemize gerek yok.

onClick fonksiyonunda listview de yer alan imagebutton lara tıklandığı an neler yapması gerektiğini belirttik. Adapter sınıfımızda anlatmış olduğum tag yapısını burada alarak önce hangi imagebuttona tıklandığını bulduk ve daha sonrasında ilgili işlemleri yaptırdık.  Arama için kullandığımız imagebutton da ilgili kişinin telefon numarası ile arama yapabildik. Mesaj gönderme için kullandığımız imagebutton da ise ilgili kişiye sms gönderme için gerekli sayfayı açtık. Zaten kaynak kodlarını indirip cihazınızda çalıştırdığınızda ne demek istediğimi anlayacaksınız.

ListView e tıkladığımız an çalışan setOnItemClickListener ile de DetailsFragment adını verdiğimiz fragment yapısını oluşturduk ve o fragment a Bundle yardımı ile tıklanan kişinin ismini ve telefon numarasını gönderdik.

ListViewFragment.java

ListViewFragment sayfamızın görsel kısmı aşağıdadır.

fragment_list.xml

Yukarıda bahsettiğim gibi hangi listview itemine tıklıyorsanız , tıkladığımız kişinin ismini ve telefon numarasını parametreler yardımı ile yeni sayfaya gönderiyoruz. Bu sayfayıda Fragment yapısında oluşturduk. Burada da diğer fragment sayfamızdan yolladığımız değerleri alıp ekranda gösterdik ayrıca aşağıdaki kodlar da gördüğünüz gibi imagebutton lara tıkladığımız zaman arama ve mesaj gönderme işlemlerini burada da gerçekleştirdik.

ListViewFragment sayfamızdan gönderilen verileri alabilmemiz için View ı yaratmadan getArguments ile o verilere erişmemiz gerekmektedir aksi halde, View i inflate ettikten sonra almaya çalışırsanız değerlerin gelmediğini göreceksiniz.

DetailsFragment.java

DetailsFragment sayfamızın görsel kısmıda aşağıdadır.

fragment_details.xml

Zaten gerekli olan açıklamaları comment şeklinde kaynak kodumuza yazdım. Bu dersimizin kaynak kodunu indirip Android cihaz da çalıştırıp , çalışma mantığını kendinizde görebilirsiniz.

Evet arkadaşlar bu dersimizin de sonuna geldik , özetleyecek olursam cihazımızın rehberinde bulunan kişileri ve telefon numaralarını çekerek listview içinde gösterdik , listview de her bir iteme tıklandığı an yeni bir fragment açarak kişinin bilgilerini gösterdik. Her iki sayfamız da da arama ve sms gönderme işlemlerini gerçekleştirdik. Aslında bu dersimizdeki asıl amacımız ; fragment ların kullanım mantığı ve listview de yer alan item lere tıklandığı zaman, o tıklanma olaylarının nasıl gerçekleşmesi gerektiğini göstermekti umarım hepinize faydalı bir ders olmuştur.

 

 

NOT: ( Uygulamayı Emulator de çalıştırıp neden olmuyor demeyin.. o yüzden gerçek cihaz da test edin )

Ders hakkında soru ve önerilerinizi çekinmeden yorum bırakabilirsiniz. Bol Android’li günler sizin olsun 

Sizlerden ricamız facebook.com/mobilhanem sayfamızı beğenmenizdir. Diğer dersimde görüşmek üzere kendinize iyi bakın..

Yazar Hakkında

Yüksek Lisans: Çankaya Üniversitesi / Bilgisayar Mühendisliği Lisans: Çankaya Üniversitesi / Bilgisayar Mühendisliği (4/3.30) (2010-2014) Lisans : Viyana Teknik Üniversitesi / Bilgisayar Bilimleri (2013)
  • cihan_51

    Merhaba hocam, gerçekten yararlı bir ders olmuş emeğinize sağlık.

    • Alper Beyler

      çok teşekkürler saolun

  • Sefer Koç

    Öncelikle ders anlatımınız için teşekkürler, benim bir kaç sorum olacak, birincisi Gridview kullanarak yapmaya çalışırsak içindeki bileşenlere tıklama mantığı aynı şekilde çalışır mı ? ikincisi ise Adapter sınıfı içinde click fonksiyonunu tetiklesem aynı sonucu elde edemez miyim ?

    • Alper Beyler

      Merhabalar, Gridview kullanarak yaparsanız çalışma mantığı yine aynı olacaktır. Adapter fonksiyonu içinde de click olayını oluşturabilirsiniz fakat pek önerilen bir yol değil çünkü adapter sınıfı bir yapıyı doldurmanıza yarar içine belli başlı bileşenleri belirtirsiniz viewholder ile de bunları set edersiniz. bir yapının iç kısmını oluşturmak için hep kullanılır bu yüzden click olayını çalışması gereken ilgili yer neresi ise orada yapmanızı tavsiye ederim.

      • Sefer Koç

        Merhaba, Çok teşekkürler hocam verdiğiniz bilgiler için

  • ouozavci

    R.id.key_position nerde tanımlı neyin id’si acaba tam anlamadım yardımcı olabilir misiniz?

  • mithat

    Rehberdeki isimleri neden alfabeye göre sıralamıyor.Karışık çekiyor.

    • mithat

      Nasıl Yapabiliriz.

      • Alper Beyler

        Merhabalar bu kodu kullanarak dener misiniz ? alfabetik sıralı bir şekilde listeyi düzenleyecektir
        Cursor cursor = getContentResolver.query(Phone.CONTENT_URI, null, null, null,Phone.DISPLAY_NAME + ” ASC”);

        • mithat

          Çok sağolun yanıt için. new FetchAsyncTask().execute(); ve progressDialog.show(); satırlarında hata alıyorum şuan.

          • Alper Beyler

            logcat de ne yazıyor nasıl bir hata alıyorsunuz ? debug ederken dönen değeri cursor da görebilirsiniz alfabetik mi değil mi

  • Mithat

    R.id.key_position id sini nerde tanımladınız. Kod içinde 2 yerde var fakat tanımlandığı yeri bulamadım.

    • Mithat

      Buldum.Kusura Bakmayın.

  • Şahin Aygün Yıldırım

    Dersleriniz çok yararlı oldu, emeğinize sağlık. 4 tab’den oluşan bir uygulama yapmaya çalışıyorum, fakat fragment içinde webView kullanamama gibi bir sorunum var. Çalışan projemdeki kodları birebir kullanmama rağmen fragment içindeki webview bir türlü yüklemiyor sayfayı. Bu konuyla ilgili küçük bir ders hazırlamanız mümkün mü acaba?

  • enes

    hocam bana bunun e posta örnegi lazım visualda bana yardımcı olabilirmisiniz.

    • Alper Beyler

      merhaba , android ,ios konusunda yardımcı olabilirim isterseniz bu sorunuzu sitemizin soru cevap kısmına yazın visual bilen biri yardımcı olabilir https://sorucevap.mobilhanem.com