Aklımda Kalası Kelimeler

* давайте работать вместе
* Zarf ve Mazruf, Zerafet(xHoyratlık) ile aynı kökten(za-ra-fe) gelir
* Bedesten
* Suç subuta ermiştir - Suç sabit olmuştur

29 Temmuz 2011 Cuma

UML 2





Referanslar:
  1. teodorfilimon.com
  2. www.ibm.com
  3. www.agilemodeling.com
  4. wikipedia.com
  5. www.ce.yildiz.edu.tr
  6. www.cs.drexel.edu


MODEL : ÖRNEK, NUMUNE, KALIP
MODELLING (MODELLEMEK) : KALIBINI ÇIKARTMAK


Kalıbı çıkartılmış(modellenmiş) bir sistem düşünüyorum. Yani sistemin her türlü bilgisini içeren bir kalıbımız var.

Elbise mankeni olsun bu sistem. Ve çıkan cam elyaftan yapılmış mankenin ölçüleri ideal bir insan ölçüsünde. Ayrıca başını sağa, sola çevirebiliyoruz. Kolunu yukarı-aşağı, ayaklarını yine aynı şekilde HAREKET ettirebiliyoruz.

DIAGRAM : Diyagram, Şema, Taslak

STATIC : Sabit, Değişmez, Durgun
STRUCTURE : Yapı, Bünye, Bina

İşte bu elbise mankenimizin ölçüleri, rengi v.s. bizim için statik(değişmez, sabit) bilgileri gösteren taslak, yapı(STRUCTURE) diyagramıdır(şeması, taslağı). Yapı taslağı; sınıfları, bileşenleri içerir.

BEHAVIORAL : Davranış, Davranışsal
Hareket edebilmesi(hareketleri ile görsel etkileşime geçebilmesi) ise davranışsal(behaivoral) taslağıdır(diyagramıdır). Davranışsal diyagramlar ise yöntemleri(METHODS), işbirliklerini(COLLABRATIONS) ve aktiviteleri(ACTIVITIES) içerir. Collaboration will be in one of two forms: a request for information or a request to perform a task. İşbirliklerini çıkartmak için sınıfın her sorumluluğunu düşünerek şu soruyu sormalıyız: "Sınıfın bu sorumluluğu yerine getirmek için yeteneği var mı?" Eğer bu sorunun cevabı "HAYIR" ise, bu işi yapacak yeni bir sınıf aramak gerekir.

UML : Unified Modelling Language (Birleşik Modelleme Dili)
İşte UML de hem statik, hem de davranışsal taslaklarını esas alır.

Yapısal Taslaklar(Structural Diagrams), sistem türlerini(sınıfları) ve bunların örneklerini(nesneleri) gösteren yanı sıra, yapı diyagramlarının kendi iç yapısı arasındaki ilişkiyi göstermektedir. Yazılımın hayat çevrimi boyunca gerekecektir.

Yapısal Taslak(structural diagram), bir diyagram olmayıp UML 2 nin ana kategorilerinden birisidir (diğer behavioral diagram-davranışsal taslak-).

Sınıf Diyagramı(Class Diagram), yapısal taslağın bir türü olup, sistemin tiplerini diğer taslakların kullanımı için en önemli taslaktır.
UML modellerinin çoğu şu türleri içerir:
  • Sınıf(class)
  • Arayüz(interface)
  • Veri Tipi(Data Type)
  • Bileşen(Component)
Bu türlere sınıflandırıcılar(classifiers : Veri tipi ve arayüz içeren genel kavram) denir. Sınıflandırıcıyı teknik olarak bir sınıf gibi düşünebiliriz. Ancak yukarıdaki türlerin genel adı olduğuda akıldan çıkartılmamalıdır.

Aşağıdaki gösterim bir havayolu şirketinin uçuşunu gösteren bir sınıf diyagramıdır. 3 Bölmeden oluşan bu diyagramda ilk satır sınıfın adını, ikinci satır uçuş sınıfının özelliklerini ve üçüncü satır ise uçuş sınıfının işlemlerini(method) göstermektedir. Geniş bir sistem modeli gösteriminde sadece birinci satır(sınıf adı) gösterilir.Bu sınıf tanımında görüldüğü gibi uçuş süresi "dakika" olarak gösterilmiştir. Kullanıcıya anlamlı gelmesi için özelliğin türü dakika, dolar v.s. olabilir.

Bir sınıf özelliğinin başlangıç değeri olabilir. Örneğin aşağıdaki sınıf tanımında hesap açıldığında 0 bakiye ile açılmalıdır.

Miras(Inheritance)


Bir sınıfın özelliklerini başka bir sınıfa geçirmek için miras kullanılır. Bu tarafını biliyor olmalıyızki UML öğrenmeye geldik değilmi. Miras almayı gösterme şekli önemli kısmıdır. Düz, kesiksiz bir çizgi ve kapalı, içi boş bir üçgen ok başıyla miras alma gösterilir.
Yukarıdaki resimde "BankAccount" sınıfı ve "withdrawal" metodunun eğik yazılmıştır. Çünkü "BankAccount" sınıfı "abstract sınıf" (soyut sınıf) ve "withdrawal" metodu "abstract method" (soyut metot) olarak gösterilmiştir.

ASSOCIATION : Ortaklık, işbirliği, birleşme

Ortaklık, İşbirliği


Ortaklıklar (iş birlikleri), sınıfların örnekleri arasındaki ilişkileri gösteren bağlantılardır.
5 tip ortaklık(association) vardır.
  1. bi-directional (çift yönlü)
  2. uni-directional(tek yönlü)
  3. Association Class(İşbirliği Sınıfı)
  4. Aggregation (includes Composition aggregation)(Toplama)
  5. Reflexive
En çok çift ve tek yönlü işbirlikleri kullanılmaktadır.

Çift Yönlü (Bi-Directional)

Örneğin uçuş sınıfı, uçak sınıfıyla çift yönlü bir işbirliği içindedir. Bu ortaklık, iki sınıfın nesneleri arasında paylaşılan statik bir ilişkiyi temsil etmektedir. Bi-directional ilişkide her iki taraftaki sınıfta etkileşim içindedir. Bir çift yönlü bir ilişki iki sınıf arasındaki düz bir çizgi ile gösterilir.

Yukarıdaki şekilde, Flight sınıfı Plane hakkında bilgi sahibidir. Aynı zamanda uçak sınıfıda uçuş sınıfından haberdardır.
Plane(uçak) sınıfının rol adı hemen yanında "assignedPlane" olarak belirlenmiş. Uçak sınıfının yanındaki 0..1 ile Flight(uçuş) sınıfından üretilmiş bir örneğinin "ya 1 uçak nesnesi ile ilişkisi var ya da henüz bir uçak nesnesi tayin edilmemiş" tanımı yapılıyor.
Flight(uçuş) sınıfının rol adı ise "assignedFlights" (atanmış uçuşLAR -0..*-) olarak belirlenmiş. Her uçak nesnesi ya 0 uçuşla ya da sonsuz uçuşlarla(örneğin son 5 yıllık uçuşlar gibi) ilişkilidir.

Çokluk değerleri ve onların ilişkileri
GöstergeAnlam
0 .. 1Sıfır ya da bir
1Sadece tek bir
0..*Sıfır veya daha fazla
*Sıfır veya daha fazla
1..*Bir veya daha fazla
3Sadece üç
0..5Sıfır ya da Beş
5..15Beş ila On Beş

Tek Yönlü (Uni-Directional)

İki sınıfla ilgili bir ilişki ama sadece bir sınıf bu ilişkiden haberdardır. Çift yönlü ilişki, düz bir çizgi ile belirtilir.Rapor sınıfı hangi sınıfı raporladığını bilmeli ama raporlanan sınıfın Rapor sınıfını bilmesi gereksizdir. Yukarıdaki resimde, OverdrwanAccountsReport sınıfı BankAccount sınıfını biliyor ama BankAccount sınıfı aralarındaki bu ilişkiyi bile bilmiyor.Tek yönlü ilişki, ilişkiden habersiz sınıfa doğru düz bir çizgi ve ucu açık bir ok ile belirtilir. Bu şekilde olan bağlar "esnek bağ" olarak tanımlanır ve sistem değişikliklerini daha uyumlu hale getirir.

Paketler

Sınıflar paket (namespace) adı verilen mantıksal kümelere ayrılabilir.
Amaç: Kendi içerisinde anlam bütünlüğü olan ve belli bir amaca yönelik olarak birlikte kullanılabilecek sınıfları bir araya toplamaktır.

Büyük bir sistemi modellerken bir çok sınıfımız ortaya çıkacaktır. Bu sınıfları namespace gibi klasörler altında toplamak sistemin modellenmesini ve organizasyonunu kolaylaştıracaktır.Büyük bir dikdörtgende gösterilecek tüm üyeler(konuya özel sınıflar) ve en üstte paketin(konunun) adı olmalı.
Eğer tersi durumda göstermek istersek yani paketin üyelerini(konuya özel sınıfları) paketin dışında göstermek istersek aşağıdaki gibi sınıflardan pakete düz çizgiler çizer ve paketin altında içi artı olan bir dairede birleştiririz.

İşbirlikleri(associations) ile ilgili kalan 3 işbirliği tipini ilerleyen kısımlarda göreceğiz (İşbirliği sınıfları(association class), Toplama(Aggregation) ve Reflexive İşbirliği(Reflexive Association)).


Arayüzler (Interfaces)

Arayüzlerde sınıflar gibi veri tipleridir. Sınıflardan nesneler örneklenirken arayüzler bir sınıf tarafından uygulandıktan sonra örneklenebilirler. Aşağıdaki resimde olduğu gibi, Profesör ve Öğrenci sınıfları Kişi arayüzünü uygulamış oldukları için bu sınıflar aynı zamanda Kişi tipindedirler. Arayüzleri gösterirken sınıflardan farklı olarak "<<interface>>" şeklinde gösterilir. UML 2 de sınıflar içinde "<<class>>" yazmanızda sakınca yok ama buna gerekte yok.
Resimdeki yapının kalıtım olmadığı çizginin kesikli olmasından anlaşılıyor. Kesikli çizgili, kapalı ve içi doldurumlamış ok, bize gerçekleştirme ya da uygulama olduğunu gösterir.

Sıra Ortaklıklarda anlatılmamış 3 tipte (Association Class, Aggregation, Reflexie Association)

Association Class (Ortaklık Sınıfı)

Normal sınıflar gibidirler tek farkı, birincil iki sınıf arasındaki ilişkiyi noktalı bir çizgi ile kesmesidir.Yukarıdaki resimde sıkUçan yolcu sınıfı ile uçuş sınıfı arasındaki ilişkiye kazanılan mil puanları tutan bir MileageCredit sınıfının dahil olması gösteriliyor.

when an association itself has attributes or operations of its own …
or when it participates in relationships with other classes

24 Temmuz 2011 Pazar

Java'da DefaultHandler

Referanslar:
oracle.com
jenkov.com
java2s.com
ibm.com
godoro.com
www.ahmetcebisli.net
Kısaltmalar:

SAX : Simple API for XML
DOM : Document Object Model
XML : Extensible Markup Language

PARSER : ÇÖZÜMLEYİCİ
Java'da XML Çözümleyiciler: Sax Parser, Dom Parser, Xml Pull Parser


Öncelikle bu çözümleyicilerin avantaj ve dezavantajları:
  • SAX çözümleyici, DOM çözümleyiciden hızlıdır, az belek harcar. Söylenti odur ki; DOM çözümlemede SAX kullanır ve üstüne ek işleri yapar. Nitekim DOM veriyi bir kere belleğe yüklerken, akış(stream) temelli olan SAX işini gördükten sonra bellkele ilişkisini keser. Oysa DOM tüm düğümleri(xml etiketlerini) bağladıktan sonra işleme müsade eder.




Aşağıdaki örneği jenkov.com dan aldım aslında ama referanslardaki diğer örneklerle birleştirerek anladığımı not olarak yazayım istedim.
DefaultHandler hakkında biraz fikir veriyor ;)

Özetle: DefaultHandler

Aşağıdaki xml'i SAXParser'a göndereceğiz. XML'i veritabanındaki bir tablo gibi düşünün. Tablonun satırlarıda var tabii. Her satırını XML etiketlerine sardığınızı düşünün. Bu XML etiketleri içlerinde tablonun satırındaki her kolonunu ayrı XML etiketlerine sarılmış olarak düşünün. İşte aşağıdaki XML bizim tablomuz, her child etiketi satırlarımız ve grandchild etiketlerininde sütunumuz olduğunu düşünün. Düşündünüz mü? E o zaman XML'in neden veri taşımada çok becerikli ortacımız olduğunu anlamışsınız. Şimdi biz aşağıdaki XML'i bir sınıf gibi düşünün. child adında bir sınıfımız var. grandchild adında String veri tutan birde property'si, field'ı ya da global değişkeni olsun(hepsinin aslında neredeyse aynı anlamları olduğunu biliyorsunuz zaten). Şimdi biz bu child sınıfından her satır veri için birer nesne türeteceğiz. Bu işi yapmak için SAXParser kardeşimizin bu satırı parçalamak istediğimiz şablonu istemesi çok normal. İşte bu şablonu DefaultHandler sınıfını miras alarak yapacağız.

ornek.xml
<root>
    <child>
        <grandchild>text 1</grandchild>
    </child>
    <child>
        <grandchild>text 2</grandchild>
    </child>
</root>


// Sonucu görmek için çalışacak sınıfımız.
// Giriş noktası ya da metodu olan projenin tek sınıfı.
// (entry point: static void main() metodu yani sınıfın çalıştırılacak ilk metodu) olan tek sınıfımız)
public class MainClass {
  public static void main(String args[])throws Exception {
    SAXParserFactory spf = SAXParserFactory.newInstance();
    SAXParser parser = spf.newSAXParser();

    MySAXHandler handler = new MySAXHandler(); 
    parser.parse(new File("ornek.xml"), handler);
  }
}


// Tüm XML dosyasının nasıl işleneceğini belirten ŞABLON SINIFIMIZ
public class SaxHandler extends DefaultHandler {

    public void startDocument() throws SAXException {
        System.out.println("start document   : ");
    }

    public void endDocument() throws SAXException {
        System.out.println("end document     : ");
    }

    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {

        System.out.println("start element    : " + qName);
    }

    public void endElement(String uri, String localName, String qName) throws SAXException {
        System.out.println("end element      : " + qName);
    }

    public void characters(char ch[], int start, int length) throws SAXException {
        System.out.println("start characters : " + new String(ch, start, length));
    }
}


Hemen aşağıdaki sonucu üretir:

start document :
start element : root
characters :

start element : child
characters :

start element : grandchild
characters : text 1
end element : grandchild
characters :

end element : child
characters :

start element : child
characters :

start element : grandchild
characters : text 2
end element : grandchild
characters :

end element : child
characters :

end element : root
end document :


Eğer XML satırlarını Child sınıfından nesneler olacak şekilde üretmek isteseydik


// Child sınıfımız aşağıdaki gibi sadece grandchild etiketinin değerini taşıyacak.
class Child {
  public String GrandChild;
  public setGrandChild(String _grandChild){
    this.GrandChild = _grandChild;
  }
}


public class ChildHandler extends DefaultHandler{
    private List cocuklar;
    private Child islenenCocuk;
    private StringBuilder tumXML;
    
    public List getCocuklar(){
        return this.cocuklar;
    }

// Bu sınıf XML etiketinin içindeki kısmını verecek. 
// Örneğin: <grandchild>Ahmet Emmi</grandchild> etiketindeki 
// Ahmet Emmi kısmını characters metodu verecek.
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        super.characters(ch, start, length);
        tumXML.append(ch, start, length);
    }

// XML dosyasının ROOT elemenanın okuduğumuz metodumuz startDocument olacak.
    @Override
    public void startDocument() throws SAXException {
        super.startDocument();
        cocuklar = new ArrayList();
        tumXML = new StringBuilder();
    }

// Her bir etiketi (element) okumaya başladığımız an: startElement
    @Override
    public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
        super.startElement(uri, localName, name, attributes);
        if (localName.equalsIgnoreCase("child")){
            this.islenenCocuk = new Child();
        }
    }


// XML etiketini okuma işi bitince (Tek bir etiketi)
    @Override
    public void endElement(String uri, String localName, String name) throws SAXException {
        super.endElement(uri, localName, name);

        // islenenCocuk eğer başlatılmışsa. 
        // Yani child etiketi okunmaya başlanmışsa islenenCocuk null değildir artık.
        if (this.islenenCocuk != null){

            // eğer bu eleman grandchild ise
            if (localName.equalsIgnoreCase("grandchild")) 
            {
                islenenCocuk.setGrandChild(builder.toString());
            } 
            else if (localName.equalsIgnoreCase("child"))
            {
                cocuklar.add(islenenCocuk);
            }

            // Eğer bir etiketi daha işlediysek StringBuilder dan türettiğimiz
            // ve içinde metin bilgisini tutan değişkeni boşaltıyoruz.
            tumXML.setLength(0);    
        }
    }
}


Hepsi bittiyse bir de bu adresi okuyarak pekiştirin derim.

XmlPullParser

Yapı SAX'a nispetle daha basit.
	public void ReadXml() throws XmlPullParserException {
// Android için res klasörünün içindeki xml klasörünün içindeki countries.xml dosyası
		XmlPullParser parser = getResources().getXml(R.xml.countries);

// parser oluşturuldu. Acaba hangi elementteyiz? Bunu getEventType() metoduyla çekiyoruz
// START_DOCUMENT, END_DOCUMENT, START_TAG,TEXT,COMMENT v.s. olacaktır.
		int eventType = parser.getEventType();

// XML'imizin sonuna gelene dek while yapalım
		while (eventType != XmlPullParser.END_DOCUMENT) {
			try {

// Olaki şu an elimizdeki element TEXT tir (yani xml elementinin içidir(değeridir))
				if (eventType == XmlPullParser.TEXT) {
					CharSequence cs = parser.getText();parser.setInput(inputStream, inputEncoding)
// Log ekranında içeriği görelim
					Log.i("xml read", cs.toString());
				}

//Bir sonraki XML elementine geçelim
				eventType = parser.next();
			} catch (Exception e) {
				e.printStackTrace();
			}

		}

SimpleDateFormat ile string şeklindeki tarih saati strongly typed nesneye çevirmek

Thu, 16 Apr 2009 07:18:51 +0100
EEE, dd MMM yyyy HH:mm:ss Z

// Stringimiz:
// Thu, 16 Apr 2009 07:18:51 +0100
// olsun
static SimpleDateFormat FORMATTER = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z");
//
//ile parse edip Date objesine çevirelim


Strongly ve Weakly Typed da neyin nesi?

tag requires a 'drawable' attribute or child tag defining a drawable



Hata bu:
07-24 10:22:37.878: ERROR/AndroidRuntime(563): Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #6:  tag requires a 'drawable' attribute or child tag defining a drawable


Kaynağı:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

<!-- pressed -->
<item android:state_pressed="true" />


Çözümü:
<item android:state_pressed="true" android:drawable="@drawable/cut_btn_pressed_state"/>
YA DA
<item>
<shape>
<solid android:color="#fff"/>
<stroke android:width="1px" android:color="#ff007f" />
<corners android:radius="18dp" />
</shape>
</item>



Sonuç: Bu xml içinde item etiketi ya xml özelliği(attribute) ya da içine etiket(tag) almak istiyor, olmayıncada hata veriyor.

23 Temmuz 2011 Cumartesi

Style ile elementin stilini belirlemek.


<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="cust_btn">
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:textColor">#ffffff</item>
<item name="android:gravity">center</item>
<item name="android:layout_margin">3dp</item>
<item name="android:textSize">30dp</item>
<item name="android:textStyle">bold</item>
<item name="android:shadowColor">#000000</item>
<item name="android:shadowDx">1</item>
<item name="android:shadowDy">1</item>
<item name="android:shadowRadius">2</item>
</style>
</resources>

Özelleştirilmiş android butonu tasarlamak

Yapmak istediğimiz düğme aşağıdaki gibi. 1inci resim tıklamadan, 2inci resim tıkladıktan sonraki hali (default, pressed).



Düğmemiz android sdk sından çıkan ilk haliyle şöyledir:
<Button
android:id="@+id/cust_button"
android:text="Özel Düğme"
android:layout_width="match_parent"
android:layout_height="wrap_content" />


Button etiketi içine text özellikleri vs. ekleyelim.
      <Button
android:id="@+id/cust_button"
android:text="Özel Düğme"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:color="#444"
android:radius="18dp"
android:textColor="#ff0000"
android:gravity="center"
android:textSize="30dp"
android:textStyle="bold"
android:shadowColor="#ff00ff"
android:shadowDx="1"
android:shadowDy="2"
android:shadowRadius="3" />

Bu güzel oldu ama main.xml layout dosyamız çok kabardı ve her yeni butona bu özellikler(xml attributes) eklemek istemeyiz. Hem köşeleri hafif oval, kenarlıklı ve basıldığında başka bir görüntüsü olan buton istiyoruz. Bu durumla başa çıkmak için android:background, android:textColor, style xml özellikleri(attributes) kullanabiliriz. android:background butonumuzun kavislerini, kenarlıklarını ve varsayılan, basılı ve odaklandığında(focus-bir elemente tab ile ya da fare ile(burada parmağımız) tıklandığında) alacağı halleri tutan xml dosyamızı oluşturmalıyız. Ama önce basıldığında, varsayılan, odaklanıldığında gibi halleri(state) anlayalım.

android:background


Android de View'dan türetilmiş elemanların aşağıdaki durumları vardır:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:color="hex_color"
android:state_pressed=["true" | "false"]
android:state_focused=["true" | "false"]
android:state_selected=["true" | "false"]
android:state_checkable=["true" | "false"]
android:state_checked=["true" | "false"]
android:state_enabled=["true" | "false"]
android:state_window_focused=["true" | "false"] />
</selector>

Yukarıdaki durumlardan bizim düğmemiz(button) için geçerli olan android:state_focused ve android:state_pressed durumlarını ele alacağız.

Düğmemiz için yukarıdaki durumlarda nasıl görünmesini istiyorsak bunları res/drawable klasörüne xxxx.xml dosyası adında oluşturacağız:Bu dosya düğmemizin arka plan görüntüleri için kullanılacak.

Düğmemize basmadık; o zaman "pressed" durumuna girmeyiz, e focus'ta olmadığımıza göre default durumuna kadar geldik ve bu durumdaki şekili giydirmiş olacağız düğmemize. Akış bu şekilde olduğu için ilk denk geldiği durumu işleyecek bu yüzden en olmadığı en üste ve en varsayılan durumu ise en alta koyacağız.
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

<!-- pressed: the first item in the state list that matches the current state -->
<item android:state_pressed="true" ></item>

<!-- focused -->
<item android:state_focused="true" ></item>

<!-- default: value should always be last -->
<item></item>
</selector>



Varsayılan(default) durum yani düğmemizin kendi başına mel mel bakındığı durumu::
<!-- default -->
<item>
<shape>
<!-- Opak olarak beyaz (#fff) arka plan -->
<solid android:color="#fff"/>
<!-- Kenarlık diye 1px #ff007f renginde(stroke) -->
<stroke android:width="1px" android:color="#ff007f" />
<!-- Köşeler 18dp çapında yuvarlansın -->
<corners android:radius="18dp" />
</shape>
</item>


Artık diğer durumlarıda xml dosyamıza ekleyelim. FOCUS olduğunda ya da PRESSED olduğunda kenarlık rengini #444 rengine çekelim ve arka plan renginide geçişli(gradient) renk olarak boyayalım(startColor="#3787ff" endColor="#2f72d7" angle="270") ve dosyamızın son halini görelim:
cust_btn_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

<!-- pressed -->
<item android:state_pressed="true" >
<shape>
<stroke android:width="1px" android:color="#444" />
<corners android:radius="18dp" />
<gradient android:startColor="#3787ff" android:endColor="#2f72d7" android:angle="270" />
<corners android:radius="18dp" />
<!-- Düğmenin arka rengini tek renk yapmak istersek: -->
<!-- solid android:color="#ffff00" kullanırız -->
</shape>
</item>

<!-- focused -->
<item android:state_focused="true" >
<shape>
<stroke android:width="1px" android:color="#444" />
<corners android:radius="18dp" />
<gradient android:startColor="#3787ff" android:endColor="#2f72d7" android:angle="270" />
<corners android:radius="18dp" />
</shape>
</item>

<!-- default -->
<item>
<shape>
<solid android:color="#fff"/>
<stroke android:width="1px" android:color="#444" />
<corners android:radius="18dp" />
</shape>
</item>
</selector>
Yukarıdaki gibi her birini item etiketlerinin altına yazabildiğimiz gibi, bu durumları ayrı xml dosyalarına bölüp item etiketine ilgili durumun xml dosyasınıda verebiliriz. Tıpkı aşağıdaki gibi:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

<!-- pressed -->
<item android:state_pressed="true" android:drawable="@drawable/cust_btn_pressed_state"/>

<!-- focused -->
<item android:state_focused="true" >
<shape>
<stroke android:width="1px" android:color="#444" />
<corners android:radius="18dp" />
<gradient android:startColor="#3787ff" android:endColor="#2f72d7" android:angle="270" />
<corners android:radius="18dp" />
</shape>
</item>

<!-- default -->
<item>
<shape>
<!-- Opak olarak beyaz (#fff) arka plan -->
<solid android:color="#fff"/>
<!-- Kenarlık diye 1px #ff007f renginde(stroke) -->
<stroke android:width="1px" android:color="#ff007f" />
<!-- Köşeler 18dp çapında yuvarlansın -->
<corners android:radius="18dp" />
</shape>
</item>

</selector>
Pressed halini drawable klasöründe cust_btn_pressed_state.xml dosyasına yazıyor ve item etiketinede android:drawable="@drawable/cust_btn_pressed_state" xml özelliği içinde belirtiyoruz.
Peki cust_btn_pressed.xml dosyamız nasıl oldu:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Artık state_pressed olduğunu buraya yazmamıza gerek yok. Çünkü bir üst xmlden bu xml i çağırıyoruz ve orada state_pressed olarak belirtildi. -->
<item>
<shape>
<stroke android:width="1px" android:color="#444" />
<corners android:radius="18dp" />
<gradient android:startColor="#3787ff" android:endColor="#2f72d7" android:angle="270" />
<corners android:radius="18dp" />
</shape>
</item>

</selector>

android:text


Düğmemizin üstüneki yazıya renk, gölge, ebat, tarz(stil) eklemek için kullandığımız xml özelliklerini(attribute) her düğmeye bu özellikleri tekrar tekrar yazmamak için tarz(style) dosyası oluşturmamız gerek. styles.xml dosyasına uygulamamızın css dosyası gibi bakabiliriz. Burada bir css elementi oluşturur style etiketi içine tarz bilgilerini yazalım.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="cust_btn_stil">
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:textColor">#ffffff</item>
<item name="android:gravity">center</item>
<item name="android:layout_margin">3dp</item>
<item name="android:padding">10dp</item>
<item name="android:textSize">20dp</item>
<item name="android:textStyle">normal</item>
<item name="android:shadowColor">#e2e</item>
<item name="android:shadowDx">1</item>
<item name="android:shadowDy">1</item>
<item name="android:shadowRadius">2</item>
</style>
</resources>
Artık düğmemize(button) şu xml özelliğini(xml attribute) ekleyerek düğmemizin üstündeki metnin tarzını hızlıca atamış oluruz. Dahası bundan sonra aynı tarzda olacak elemanlarada kısaca bu bilgiyi atayabiliriz.
<Button
android:id="@+id/btnNext"
android:text="@string/btnNext"
android:background="@drawable/cust_btn_bg"
style="@style/cust_btn_tarz" />


android:textColor


cust_btn_text.xml adlı dosyayı res/drawable klasöründe saklayalım.Text özelliklerini biraz değiştirerek yukarıdaki styles.xml dosyasında sakladık ama düğmeye basıldığında metin rengi değişik olsun istiyoruz. Bunu sağlamak için cust_btn_text.xml dosyasını aşağıdaki gibi düzenleyelim:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- pressed -->
<item android:state_pressed="true" android:color="#ffff00" />

<!-- focused -->
<item android:state_focused="true" android:color="#fff" />

<!-- default -->
<item android:color="#385487" />

</selector>
Artık düğmemizin metin rengide her durumda farklı bir renk alacak. Bu kaynak dosyasını(resource file hatta drawable file) düğmemizin belirtildiği(declare edildiği) xml etiketinde android:textColor xml özelliğinde belirtelim. Artık düğmemizin son hali:
<Button
android:id="@+id/btnNext"
android:text="@string/btnNext"
android:background="@drawable/cust_btn_bg"
style="@style/cust_btn_tarz"
android:textColor="@drawable/cust_btn_text" />
olacak.

Bu kadar yeterli sanırım bu işi anlamak için. Sonuçta çıkan düğmenin renkleri başta belirttiğimiz gibi olmadı çünkü bende öğrenirken oynaya oynaya yoldan çıkarttım düğmemizi :)



Referanslar: Drawable Resources(developer.android.com)
Bitmap File
A bitmap graphic file (.png, .jpg, or .gif). Creates a BitmapDrawable.
<ImageView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:src="@drawable/myimage" />

Nine-Patch File
A PNG file with stretchable regions to allow image resizing based on content (.9.png). Creates a NinePatchDrawable.
<Button
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:background="@drawable/myninepatch" />

Layer List
A Drawable that manages an array of other Drawables. These are drawn in array order, so the element with the largest index is be drawn on top. Creates a LayerDrawable.
<layer-list
xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:drawable="@[package:]drawable/drawable_resource"
android:id="@[+][package:]id/resource_name"
android:top="dimension"
android:right="dimension"
android:bottom="dimension"
android:left="dimension" />
</layer-list>

State List
An XML file that references different bitmap graphics for different states (for example, to use a different image when a button is pressed). Creates a StateListDrawable.
<selector xmlns:android="http://schemas.android.com/apk/res/android"
android:constantSize=["true" | "false"]
android:dither=["true" | "false"]
android:variablePadding=["true" | "false"] >
<item
android:drawable="@[package:]drawable/drawable_resource"
android:state_pressed=["true" | "false"]
android:state_focused=["true" | "false"]
android:state_selected=["true" | "false"]
android:state_checkable=["true" | "false"]
android:state_checked=["true" | "false"]
android:state_enabled=["true" | "false"]
android:state_window_focused=["true" | "false"] />
</selector>

Level List
An XML file that defines a drawable that manages a number of alternate Drawables, each assigned a maximum numerical value. Creates a LevelListDrawable.
<level-list
xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:drawable="@drawable/drawable_resource"
android:maxLevel="integer"
android:minLevel="integer" />
</level-list>

Transition Drawable
An XML file that defines a drawable that can cross-fade between two drawable resources. Creates a TransitionDrawable.
<transition
xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:drawable="@[package:]drawable/drawable_resource"
android:id="@[+][package:]id/resource_name"
android:top="dimension"
android:right="dimension"
android:bottom="dimension"
android:left="dimension" />
</transition>

Inset Drawable
An XML file that defines a drawable that insets another drawable by a specified distance. This is useful when a View needs a background drawble that is smaller than the View's actual bounds.
<inset
xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/drawable_resource"
android:insetTop="dimension"
android:insetRight="dimension"
android:insetBottom="dimension"
android:insetLeft="dimension" />

Clip Drawable
An XML file that defines a drawable that clips another Drawable based on this Drawable's current level value. Creates a ClipDrawable.
<clip
xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/drawable_resource"
android:clipOrientation=["horizontal" | "vertical"]
android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" |
"fill_vertical" | "center_horizontal" | "fill_horizontal" |
"center" | "fill" | "clip_vertical" | "clip_horizontal"] />

Scale Drawable
An XML file that defines a drawable that changes the size of another Drawable based on its current level value. Creates a ScaleDrawable
<scale
xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/drawable_resource"
android:scaleGravity=["top" | "bottom" | "left" | "right" | "center_vertical" |
"fill_vertical" | "center_horizontal" | "fill_horizontal" |
"center" | "fill" | "clip_vertical" | "clip_horizontal"]
android:scaleHeight="percentage"
android:scaleWidth="percentage" />

Shape Drawable
An XML file that defines a geometric shape, including colors and gradients. Creates a ShapeDrawable.
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape=["rectangle" | "oval" | "line" | "ring"] >
<corners
android:radius="integer"
android:topLeftRadius="integer"
android:topRightRadius="integer"
android:bottomLeftRadius="integer"
android:bottomRightRadius="integer" />
<gradient
android:angle="integer"
android:centerX="integer"
android:centerY="integer"
android:centerColor="integer"
android:endColor="color"
android:gradientRadius="integer"
android:startColor="color"
android:type=["linear" | "radial" | "sweep"]
android:usesLevel=["true" | "false"] />
<padding
android:left="integer"
android:top="integer"
android:right="integer"
android:bottom="integer" />
<size
android:width="integer"
android:height="integer" />
<solid
android:color="color" />
<stroke
android:width="integer"
android:color="color"
android:dashWidth="integer"
android:dashGap="integer" />
</shape>

IllegalStateException :Scollview can host only one direct child

ERROR/AndroidRuntime(287): java.lang.RuntimeException: Unable to start activity ComponentInfo{cem.examples.reminder/cem.examples.reminder.main}: java.lang.IllegalStateException: ScrollView can host only one direct child

ScrollView tek elemanı içinde barındırabilir. İlla birden fazla elemanı içinde barındıracaksa ScrollView içine LinearLayout ve diğer elemanlarınızıda LinearLayout içine koyarak gösterebiliriz.


Hatalı olan:

<ScrollView
android:id="@+id/svVertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tvTitle"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="BAŞLIIIIKK"
android:textSize="26dip" />

<TextView
android:id="@+id/tvContent"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="İÇERİKKKK"
android:textSize="20dip" />

<Button
android:id="@+id/btnNext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/btnNext" />
</ScrollView>


Olması gereken:
<ScrollView
android:id="@+id/svVertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/tvTitle"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="BAŞLIIIIKK"
android:textSize="26dip" />

<TextView
android:id="@+id/tvContent"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="İÇERİKKKK"
android:textSize="20dip" />

<Button
android:id="@+id/btnNext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/btnNext" />
</LinearLayout>
</ScrollView>

Sar Değerleri

Kendime notlardan: (Başka sitelerden arakladım)

2010-2011 En Yüksek Sar Değerine Sahip Telefon Marka Modelleri:

1 : LG Optimus Chic E720
SAR değeri : 1.52 wat/kg

2: Nokia C5-03
SAR değeri : 1.36 wat/kg

3: LG Optimus Chat C550
SAR değeri : 1.30 wat/kg

4: Motorola Defy
SAR değeri : 1.18 wat/kg

5: LG Optimus Black P970
SAR değeri : 1.18 wat/kg

6: Motorola Defy
SAR değeri : 1.18 wat/kg

7: Nokia C3-01 Touch and Type
SAR değeri : 1.18 wat/kg

8: iPhone 4
SAR değeri : 1.17 watt/kg

9: Nokia X6 16 GB
SAR değeri : 1.1 wat/kg

10: Nokia C3-00
SAR değeri : 1.09 wat/kg

2010-2011 En Düşük Sar Değerine Sahip Telefon Marka Modelleri:

1: Samsung Galaxy S i9000
SAR değeri : 0.24 wat/kg

2: Samsung Wave 533
SAR değeri : 0.32 wat/kg

3: Samsung Galaxy S2 i9100
SAR değeri : 0.34 wat/kg

4: HTC Sensation
SAR değeri : 0.36 wat/kg

5: Sony Ericsson Xperia Play
SAR değeri : 0.36 wat/kg

6: RIM BlackBerry Torch 9800
SAR değeri : 0.37 wat/kg

7: Samsung Galaxy 551
SAR değeri : 0.38 wat/kg

8: LG Optimus Speed P990
SAR değeri : 0.41 wat/kg

9: HTC 7 Pro
SAR değeri : 0.42 wat/kg

10: Google Nexus S
SAR değeri : 0.50 wat/kg

"The world of ListView" isimli Google I/O anlatımından


Doğrusu, önce convertView null mu değil mi diye bakın, çünkü android'de XML parsing işi pahalı bir iş ve ihtiyacınız yoksa boşu boşuna bellek yemeyin








ListView ve Adapter kullanımında yanlışlar


Local view cache kullanmak
View’lara adapter den erişmek
convertView’ın yapısını değiştirmek

Adapter’lerde verinin değiştiğini haber vermek


notifyDataSetChanged() : Yeni veya güncellenmiş veri
notifyDataSetInvalidated() : Daha fazla veri yok

Farklı view tipleriyle uğraşmak (Adapters)



- Built-in item types
- getItemViewType
o Type of View for a given position
o Used to provide the right convertView
- getViewTypeCount
o How many types to expect

Item Properties












Headers & Footers






List Selectors








Other Futures




Stack From Bottom


Text Filter




Notlar