Ana içeriğe atla

22. Android’e Bir Deprem Görüntüleyici Yaratmak

1.    Main.xml dosyasını düzenleyerek içerisine liste görünüm kontrolü ekliyoruz.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
  <ListView
    android:id="@+id/earthquakeListView"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
  />
</LinearLayout>

2.    Yeni bir Quake sınıfı yaratıyoruz. Bu sınıf, deprem tarihi, ayrıntıları, yer, büyüklük ve bağlantı ayrıntılarını depolamak için kullanılacak. Liste görünümü her depremi temsil etmek için kullanılacak, burada string sağlamak için toString yöntemini geçersiz kılın.

package com.paad.earthquake;
import java.util.Date;
import java.text.SimpleDateFormat;
import android.location.Location;
public class Quake {
  private Date date;
  private String details;
  private Location location;
  private double magnitude;
  private String link;
  public Date getDate() { return date; }
  public String getDetails() { return details; }
  public Location getLocation() { return location; }
  public double getMagnitude() { return magnitude; }
  public String getLink() { return link; }
  public Quake(Date _d, String _det, Location _loc, double _mag, String _link) {
    date = _d;
    details = _det;
    location = _loc;
    magnitude = _mag;
    link = _link;
  }
  @Override
  public String toString() {
    SimpleDateFormat sdf = new SimpleDateFormat("HH.mm");
    return sdf.format(date) + ": " + magnitude + " " + details;
  }
}

3.    Eartquake aktivitesi içerisinde, Quake objesinin ArrayList’ini depolamak için onCreate yöntemini görmezden gelerek ListView kullanan bir ArrayAdapter’ü bağlamalısınız.

package com.paad.earthquake;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.location.Location;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.MenuItem;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;
public class Earthquake extends Activity {
  ListView earthquakeListView;
  ArrayAdapter<Quake> aa;
  ArrayList<Quake> earthquakes = new ArrayList<Quake>();
  @Override
  public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.main);
    earthquakeListView = (ListView)this.findViewById(R.id.earthquakeListView);
    earthquakeListView.setOnItemClickListener(new OnItemClickListener() {
    aa = new ArrayAdapter<Quake>(getApplicationContext(), android.R.layout.simple_list_item_1, earthquakes);
    earthquakeListView.setAdapter(aa);
  }
}

4.    Bu adımda deprem besleme işlemine başlıyoruz. Bu örnek için kullanılan besleme büyüklüğü 2.5’den büyük bir deprem için bir günlük USGS linki.

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="app_name">Earthquake</string>
  <string name="quake_feed">http://earthquake.usgs.gov/eqcenter/catalogs/1day-M2.5.xml</string>
  <string name="menu_update">Refresh Earthquakes</string>
</resources>

5.    Uygulamanın internet’e erişmesi için öncelikle internet erişimine izin verilmelidir. Bunun için manifestoya uses-permission etiketi ile ekleme yapmalısınız.

  <uses-permission xmlns:android="http://schemas.android.com/apk/res/android" android:name="android.permission.INTERNET"></uses-permission>

6.    Deprem aktivitesine dönersek, yeni bir refreshEarthquakes yöntemi kullanarak veri besleme bağlayabilirsiniz. Her bir deprem kaynağını, tarih, büyüklük, bağlantı ve konum elde etmek için ayrıştırmalısınız. Deprem ayrıştırmayı bitirdiğinizde bir addNewQuake yöntemi eklemelisiniz.

  private void refreshEarthquakes() {
     URL url;
     try {
       String quakeFeed = getString(R.string.quake_feed);
       url = new URL(quakeFeed);
       URLConnection connection = url.openConnection();
       HttpURLConnection httpConnection = (HttpURLConnection)connection;
       int responseCode = httpConnection.getResponseCode();
       if (responseCode == HttpURLConnection.HTTP_OK) {
         InputStream in = httpConnection.getInputStream();
         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
         DocumentBuilder db = dbf.newDocumentBuilder();
         Document dom = db.parse(in);     
         Element docEle = dom.getDocumentElement();
         earthquakes.clear();
         NodeList nl = docEle.getElementsByTagName("entry");
         if (nl != null && nl.getLength() > 0) {
           for (int i = 0 ; i < nl.getLength(); i++) {
             Element entry = (Element)nl.item(i);
             Element title = (Element)entry.getElementsByTagName("title").item(0);
             Element g = (Element)entry.getElementsByTagName("georss:point").item(0);
             Element when = (Element)entry.getElementsByTagName("updated").item(0);
             Element link = (Element)entry.getElementsByTagName("link").item(0);
             String details = title.getFirstChild().getNodeValue();
             String hostname = "http://earthquake.usgs.gov";
             String linkString = hostname + link.getAttribute("href");
             String point = g.getFirstChild().getNodeValue();
             String dt = when.getFirstChild().getNodeValue(); 
             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss'Z'");
             Date qdate = new GregorianCalendar(0,0,0).getTime();
             try {
               qdate = sdf.parse(dt);
             } catch (ParseException e) {
               e.printStackTrace();
             }
             String[] location = point.split(" ");
             Location l = new Location("dummyGPS");
             l.setLatitude(Double.parseDouble(location[0]));
             l.setLongitude(Double.parseDouble(location[1]));
             String magnitudeString = details.split(" ")[1];
             int end =  magnitudeString.length()-1;
             double magnitude = Double.parseDouble(magnitudeString.substring(0, end));
             details = details.split(",")[1].trim();
             Quake quake = new Quake(qdate, details, l, magnitude, linkString);
             addNewQuake(quake);
           }
         }
       }
     } catch (MalformedURLException e) {
       e.printStackTrace();
     } catch (IOException e) {
       e.printStackTrace();
     } catch (ParserConfigurationException e) {
       e.printStackTrace();
     } catch (SAXException e) {
       e.printStackTrace();
     }
    finally {
    }
  }

  private void addNewQuake(Quake _quake) {
   }

7.    Her yeni işlenmiş deprem alınır ve deprem listesine eklenir. Bunu addNewQuake yöntemi ile güncellemelisiniz. Ayrıca temel veri değişmiştir ve bu durum dizi adaptörüne bildirilmelidir.

  private void addNewQuake(Quake _quake) {
     earthquakes.add(_quake);
     aa.notifyDataSetChanged();
   }

8.    Başlangıçta refreshEarthquakes çağrısı yapmak için onCreate yöntemini modifiye ediyoruz.

  @Override
  public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.main);
    earthquakeListView = (ListView)this.findViewById(R.id.earthquakeListView);
    earthquakeListView.setOnItemClickListener(new OnItemClickListener() {
    aa = new ArrayAdapter<Quake>(getApplicationContext(), android.R.layout.simple_list_item_1, earthquakes);
    earthquakeListView.setAdapter(aa);
    refreshEarthquakes();
  }


9.    Menü seçeneği için yeni bir dış string ekleyerek başlayın

<string name="menu_update">Refresh Earthquakes</string>

10.  Daha sonra menü ikonlarını göstermek için aktivitenin onCreate OptionsMenu ve onOptionsItem Selected yöntemlerini kullanmanız gerekiyor.

  static final private int MENU_UPDATE = Menu.FIRST;
  @Override
  public boolean onCreateOptionsMenu(Menu menu) {        
    super.onCreateOptionsMenu(menu);
    menu.add(0, MENU_UPDATE, Menu.NONE, R.string.menu_update);
    return true;
  }
  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    super.onOptionsItemSelected(item);
    switch (item.getItemId()) {
      case (MENU_UPDATE): {
        refreshEarthquakes();
        return true;
      }
    }
    return false;
  }

11.  İletişim kutusunda bir öğeye tıklandığında görüntülemek için yeni bir quake_details.xml düzen kaynağı oluşturmalısınız.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:padding="10sp">
  <TextView
    android:id="@+id/quakeDetailsTextView"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:textSize="14sp"
  />
</LinearLayout>

12.  Bir deprem öğesi her tıklandığında bir iletişim kutusu görüntülenir. Liste Görünümüne ItemClickListener eklemek için onCreate yöntemini kullanın.

  static final private int QUAKE_DIALOG = 1;
  Quake selectedQuake;
  @Override
  public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.main);
    earthquakeListView = (ListView)this.findViewById(R.id.earthquakeListView);
    earthquakeListView.setOnItemClickListener(new OnItemClickListener() {
      public void onItemClick(AdapterView<?> _av, View _v, int _index, long _id) {
        selectedQuake = earthquakes.get(_index);
        showDialog(QUAKE_DIALOG);
      }
    });
    aa = new ArrayAdapter<Quake>(getApplicationContext(), android.R.layout.simple_list_item_1, earthquakes);
    earthquakeListView.setAdapter(aa);
    refreshEarthquakes();
  }

13.  Depremin ayrıntılarını göstermek için iletişim kutusu oluşturuyor ve bunun için onCreateDialog ve onPrepareDialog yöntemlerini kullanıyoruz.

  @Override
  public Dialog onCreateDialog(int id) {
    switch(id) {
      case (QUAKE_DIALOG) :       
        LayoutInflater li = LayoutInflater.from(this);
        View quakeDetailsView = li.inflate(R.layout.quake_details, null);
        AlertDialog.Builder quakeDialog = new AlertDialog.Builder(this);
        quakeDialog.setTitle("Quake Time");        
        quakeDialog.setView(quakeDetailsView);
        return quakeDialog.create();
    }
    return null;
  }
  @Override
  public void onPrepareDialog(int id, Dialog dialog) {
    switch(id) {
      case (QUAKE_DIALOG) :                 
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
        String dateString = sdf.format(selectedQuake.getDate());
        String quakeText = "Mangitude " + selectedQuake.getMagnitude() + "\n"
                           + selectedQuake.getDetails()  + "\n" + selectedQuake.getLink();              
        AlertDialog quakeDialog = (AlertDialog)dialog;
        quakeDialog.setTitle(dateString);
        TextView tv = (TextView)quakeDialog.findViewById(R.id.quakeDetailsTextView);
              if (tv != null)
          tv.setText(quakeText);
        break;
    }
  }

14.  USGS’ye köprü bağlantı yaparak iletişim linkify’ı yapıyoruz. Bir otomatik link eklemek üzere iletişim kutusunda XML yerleşim kaynak tanımı ayarlamalısınız.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:padding="10sp">
  <TextView
    android:id="@+id/quakeDetailsTextView"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:textSize="14sp"
    android:autoLink="all"     
  />

</LinearLayout>

Yorumlar

Bu blogdaki popüler yayınlar

Basit ve Dinamik Disk Nedir? Birbirine Nasıl Dönüştürülür?

Sabit diskler Windows 2000 işletim sistemine kadar sadece temel disk (basic disk) olarak ayarlanabiliyordu. Temel disk en fazla 4 birincil bölüm (primary partition) veya 3 primary ve 1 genişleyebilir bölüm (extended partition) şeklinde yapılandırılabilir. Bir temel diskte sadece 1 tane extended partition oluşturulabilir ve sadece primary partitionlara işletim sistemi kurulabilir. Windows 2000 ile gelen dinamik disk teknolojisi, Windows 2000 den sonraki tüm Windowssürümlerinde kullanılabilmektedir. Dinamik disk kavramıyla bölüm (partition) kavramı yerinihacim (volume) kavramına bırakmıştır. Dinamik disklerde, temel disklerde olduğu gibi bir sınırlama yoktur. İstenildiği kadar volume oluşturabilir, temel disk istenirse dinamik hale getirebilir ve bu işlem esnasında herhangi bir veri kaybı yaşanmaz. Fakat dinamik diskler temel diske çevirildiğinde bir veri kaybı söz konusu olacaktır. Temel diskin bilgileri kayıt defterinde tutulur. Dinamik diskin bilgileri kendi üstünde tutulur.

Einstein'in Rölativite Kuramına Bakış

Bu yüzyılın başlarında kuramsal fizikte altın çağ başladığı zaman, adı henüz bilim dünyasında duyulmamış bir fizikçi vardı. Bu, Annalen der Physık’in 1905 tarihli sayısında fotoelektrik olayı, Brown hareketi ve özel görelilikle ilgili ünlü üç çalışmasını birden yayınlayarak üne kavuşan Albert Einstein’dır. Onun fizikteki hayat boyu çalışmaları bilimin felsefesi ve yöntemleri üzerinde büyük etki yaptı. Einstein’ın kendisi bilimci filozoftu. Bu yüzyılın başlarında kuramsal fizikte altın çağ başladığı zaman, adı henüz bilim dünyasında duyulmamış bir fizikçi vardı. Bu, Annalen der Physık’in 1905 tarihli sayısında fotoelektrik olayı, Brown hareketi ve özel görelilikle ilgili ünlü üç çalışmasını birden yayınlayarak üne kavuşan Albert Einstein’dır. Onun fizikteki hayat boyu çalışmaları bilimin felsefesi ve yöntemleri üzerinde büyük etki yaptı. Einstein’ın kendisi bilimci filozoftu. O, hayranlık uyandırıcı bir şekilde felsefeyi kullanarak bugün modern bilimin önemli bir kısmı olan buluşlarını

Rubik Küp Nasıl Çözülür?

Rubik küp 3x3x3 veya 4x4x4 gibi karesel formatta ve her kenarı farklı renkte olan bir küptür. Bu küpün; sabır küpü, sinir küpü, zekâ küpü, renk küpü, Rubikin küpü, sihirli küp (magic box), 3d Puzzle, gibi birçok değişik adı vardır. Unutulmamalıdır ki küpün çözümü için geliştirilmiş bir algoritma vardır. Bu küp ezbere çözülemez. Bu yazıda sizlere küpün en yaygın çözümü anlatılacaktır. Hata yaptığınız yerde hatayı düzeltmeye çalışmayın belirtilen algoritma çerçevesinde çözüme baştan başlayın. Hala küpü çözemediyseniz buradaki yazımızda belirtilen otomatik çözen programları deneyebilirsiniz. Öncelikle bilmeniz gerekenler: Küpün parçaları birbirinden bağımsız değildirler. Küpün orta noktası daima sabittir. Küpü ne kadar çevirirseniz çevirin değişmezler. Kırmızının karşısında daima turuncu, yeşilin karşısında mavi, sarının karşısında beyaz vardır. Bir küp, toplam 26 adet parçadan oluşmaktadır: 8 adet üç renkli köşe parçası, 12 adet iki renkli parça ve 6 adet de sabit tek ren