1. Main.xml dosyasını düzenleyerek içerisine liste görünüm kontrolü
ekliyoruz.
<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
Yorum Gönder