23 Haziran 2014 Pazartesi

Android kütüphanelerini XE5'de kullanma

Android ortamındaki tüm kütüphaneler henüz Delphi tarafından implemente edilmiş durumda değil. Ancak; ilgili sınıfları delphi ortamına implemente etmek genellikle çok da zor olmuyor. Bunun için d.android.com adresinden ilgili sınıfı bulup; öncelikle sınıf içinde static olan metodların varlığını kontrol etmelisiniz. Bunları bir köşeye not edin, ardından sınıf içinde constant(sabit) olarak tanımlı olan değişkenleri bulun, bunları da bir köşeye not edin. Şimdi not ettiğiniz static metodlar ve const sabitler için bir sınıf tanımlamalısınız. Kısaca bir örnek vermek gerekir ise; d.android.com'dan Toast sınıfını inceleyelim; (http://developer.android.com/reference/android/widget/Toast.html) java.lang.Object ↳ android.widget.Toast Gördüğünüz gibi sınıf, Object sınıfından türetilmiş. Demekki bizde Delphi tarafında Java Object sınıfından türeteceğiz sınıfımızı. Const bölümündeki tanımlarımıza da bakalım; int LENGTH_LONG Show the view or text notification for a long period of time. int LENGTH_SHORT Show the view or text notification for a short period of time. Görüldüğü üzere iki adet sabit tanım mevcut. Şimdi static metodlarımızı arayalım. static Toast makeText(Context context, int resId, int duration) Make a standard toast that just contains a text view with the text from a resource. static Toast makeText(Context context, CharSequence text, int duration) Make a standard toast that just contains a text view. Yukarıda görüldüğü gibi 2 adet static metodumuz var. Yazımın başında da belirttiğim gibi, static olan metodları ve sabit tanımları bir sınıf içinde yazacaktık. Hadi onu yazalım;
JToast = interface;

JToastClass = interface(JObjectClass)
['{Ctrl+Shift+G ye basınız}']
function GetLengthLong : Integer; cdecl;
function GetLengthShort : Integer; cdecl;

function makeText(Context : JContext; ResID : Integer; Duration : Integer) : JToast; cdecl;
function makeText(Context : JContext; Text : JCharSequence; Duration : Integer) : JToast; cdecl;

property LENGTH_LONG : Integer read GetLengthLong;
property LENGTH_SHORT: Integer read GetLengthShort;
end;
d.android.com da Toast sınıfı içindeki istediğimiz sabit tanımları ve static metodları bulup yukarıdaki interface'de implemente ettik. Dikkatinizi çekeceği gibi, interface'imiz JObjectClass interface'inden türüyor. Bunun sebebi Toast android sınıfının da Java Object sınıfından türüyor olması idi. Eğer Toast java domates sınıfından türüyor olsa idi, bu durumda bizim interface'imiz de JDomatesClass gibi bir interface'den türeyecekti. Delphi'ciler pek çok sınıfı bizim için implemente etmişler ama JDomatesClass gibi bir tanımlama bulamıyorsanız bu durumda o interface'i de sizin implemente etmeniz icap edecekti. Neyseki buna pek gerek kalmıyor. Ardından; dikkat çeken başka bir nokta ise; metodların cdecl ile işaretlenmesi gerekliliği. Şimdi hızlıca ilerlemeye devam edelim. Henüz işimiz bitmedi. Şimdi JToast interface'ini implemente etmeliyiz.
[JavaSignature('android/widget/Toast')]
JToast = interface(JObject)
['{Ctrl+Shift+G ye basınız}']
procedure cancel; cdecl;
function getDuration : Integer; cdecl;
function getHorizontalMargin : Single; cdecl;
..
..
..
end;
Yukarıdaki interface'imizde ise en önemli nokta JavaSignature attribute'si. İlgili interface'i bu attribute ile işaretliyoruz. Peki JavaSignature attributesi içindeki 'android/widget/Toast' da neyin nesi diyebilirsiniz. O da d.android.com 'da Toast yardımında görebileceğiniz gibi ilgili sınıfın hiyerarşisini gösteriyor. (java.lang.Object ↳ android.widget.Toast) Yine yukarıdaki interface'de dikkatinizi çekmiştir, java'da void olan dönüş türleri bir şey dönmeyecek anlamına gelir, Delphi'de de bu procedure ile temsil edildiğinden cancel metodu procedure olarak tanımlanmıştır. Ayrıca belirtmek isterim ki, android sınıfının içindeki tüm metodları implemente etmek zorunda değilsiniz, sadece ilgilendiklerinizi implemente edebilirsiniz. Henüz test etmedim ama büyük ihtimalle büyük-küçük harf ayrımına da dikkat etmeniz faydalı olacaktır. Şimdi son aşamaya geldik. Malumunuz olduğu üzere, Delphi'de herhangi bir interface'i direkt olarak create edemiyoruz. Bu interface'i implemente edecek bir sınıfa ihtiyacımız var. İlgili interface'e o sınıf instance'ı üzerinden erişim sağlayacağız. Bu vesile ile son adım olarak bir de sınıf deklare etmemiz gerekiyor. Hadi onu da yazalım;
TSucukluTost = class(TJavaGenericImport<JToastClass, JToast>)
end;
İşte bu kadar basit; artık kodlarımız içinden TSucukluTost.JavaClass.makeText(SharedActivityContext, StrToJCharSequence('Deneme'), TJToast.JavaClass.LENGTH_SHORT).show; biçiminde kullanabiliriz. Diğer sınıflar elbette bundan çok daha karmaşık olacaktır, ancak benzer adımları izleyerek sonuçlara ulaşabilirsiniz. Tabii bir çok java nesnesinin delphi'cesinin yazıldığı ilgili unitleri'de uses ile eklemeyi unutmamalısınız. Örneğin;
Androidapi.JNIBridge,
Androidapi.JNI.JavaTypes,
Androidapi.JNI.GraphicsContentViewText,
FMX.Helpers.Android;
Kolay gelsin   Bu konuyu bizimle paylaşan Tuğrul HELVACI  hocamıza teşekkür ederim. DelphiForumu.com'dan alıntıdır. Orjinal KonuAndroid ortamındaki tüm kütüphaneler henüz Delphi tarafından implemente edilmiş durumda değil. Ancak; ilgili sınıfları delphi ortamına implemente etmek genellikle çok da zor olmuyor. Bunun için d.android.com adresinden ilgili sınıfı bulup; öncelikle sınıf içinde static olan metodların varlığını kontrol etmelisiniz. Bunları bir köşeye not edin, ardından sınıf içinde constant(sabit) olarak tanımlı olan değişkenleri bulun, bunları da bir köşeye not edin. Şimdi not ettiğiniz static metodlar ve const sabitler için bir sınıf tanımlamalısınız. Kısaca bir örnek vermek gerekir ise; d.android.com'dan Toast sınıfını inceleyelim; (http://developer.android.com/reference/android/widget/Toast.html) java.lang.Object ↳ android.widget.Toast Gördüğünüz gibi sınıf, Object sınıfından türetilmiş. Demekki bizde Delphi tarafında Java Object sınıfından türeteceğiz sınıfımızı. Const bölümündeki tanımlarımıza da bakalım; int LENGTH_LONG Show the view or text notification for a long period of time. int LENGTH_SHORT Show the view or text notification for a short period of time. Görüldüğü üzere iki adet sabit tanım mevcut. Şimdi static metodlarımızı arayalım. static Toast makeText(Context context, int resId, int duration) Make a standard toast that just contains a text view with the text from a resource. static Toast makeText(Context context, CharSequence text, int duration) Make a standard toast that just contains a text view. Yukarıda görüldüğü gibi 2 adet static metodumuz var. Yazımın başında da belirttiğim gibi, static olan metodları ve sabit tanımları bir sınıf içinde yazacaktık. Hadi onu yazalım;
JToast = interface;

JToastClass = interface(JObjectClass)
['{Ctrl+Shift+G ye basınız}']
function GetLengthLong : Integer; cdecl;
function GetLengthShort : Integer; cdecl;

function makeText(Context : JContext; ResID : Integer; Duration : Integer) : JToast; cdecl;
function makeText(Context : JContext; Text : JCharSequence; Duration : Integer) : JToast; cdecl;

property LENGTH_LONG : Integer read GetLengthLong;
property LENGTH_SHORT: Integer read GetLengthShort;
end;
d.android.com da Toast sınıfı içindeki istediğimiz sabit tanımları ve static metodları bulup yukarıdaki interface'de implemente ettik. Dikkatinizi çekeceği gibi, interface'imiz JObjectClass interface'inden türüyor. Bunun sebebi Toast android sınıfının da Java Object sınıfından türüyor olması idi. Eğer Toast java domates sınıfından türüyor olsa idi, bu durumda bizim interface'imiz de JDomatesClass gibi bir interface'den türeyecekti. Delphi'ciler pek çok sınıfı bizim için implemente etmişler ama JDomatesClass gibi bir tanımlama bulamıyorsanız bu durumda o interface'i de sizin implemente etmeniz icap edecekti. Neyseki buna pek gerek kalmıyor. Ardından; dikkat çeken başka bir nokta ise; metodların cdecl ile işaretlenmesi gerekliliği. Şimdi hızlıca ilerlemeye devam edelim. Henüz işimiz bitmedi. Şimdi JToast interface'ini implemente etmeliyiz.
[JavaSignature('android/widget/Toast')]
JToast = interface(JObject)
['{Ctrl+Shift+G ye basınız}']
procedure cancel; cdecl;
function getDuration : Integer; cdecl;
function getHorizontalMargin : Single; cdecl;
..
..
..
end;
Yukarıdaki interface'imizde ise en önemli nokta JavaSignature attribute'si. İlgili interface'i bu attribute ile işaretliyoruz. Peki JavaSignature attributesi içindeki 'android/widget/Toast' da neyin nesi diyebilirsiniz. O da d.android.com 'da Toast yardımında görebileceğiniz gibi ilgili sınıfın hiyerarşisini gösteriyor. (java.lang.Object ↳ android.widget.Toast) Yine yukarıdaki interface'de dikkatinizi çekmiştir, java'da void olan dönüş türleri bir şey dönmeyecek anlamına gelir, Delphi'de de bu procedure ile temsil edildiğinden cancel metodu procedure olarak tanımlanmıştır. Ayrıca belirtmek isterim ki, android sınıfının içindeki tüm metodları implemente etmek zorunda değilsiniz, sadece ilgilendiklerinizi implemente edebilirsiniz. Henüz test etmedim ama büyük ihtimalle büyük-küçük harf ayrımına da dikkat etmeniz faydalı olacaktır. Şimdi son aşamaya geldik. Malumunuz olduğu üzere, Delphi'de herhangi bir interface'i direkt olarak create edemiyoruz. Bu interface'i implemente edecek bir sınıfa ihtiyacımız var. İlgili interface'e o sınıf instance'ı üzerinden erişim sağlayacağız. Bu vesile ile son adım olarak bir de sınıf deklare etmemiz gerekiyor. Hadi onu da yazalım;
TSucukluTost = class(TJavaGenericImport<JToastClass, JToast>)
end;
İşte bu kadar basit; artık kodlarımız içinden TSucukluTost.JavaClass.makeText(SharedActivityContext, StrToJCharSequence('Deneme'), TJToast.JavaClass.LENGTH_SHORT).show; biçiminde kullanabiliriz. Diğer sınıflar elbette bundan çok daha karmaşık olacaktır, ancak benzer adımları izleyerek sonuçlara ulaşabilirsiniz. Tabii bir çok java nesnesinin delphi'cesinin yazıldığı ilgili unitleri'de uses ile eklemeyi unutmamalısınız. Örneğin;
Androidapi.JNIBridge,
Androidapi.JNI.JavaTypes,
Androidapi.JNI.GraphicsContentViewText,
FMX.Helpers.Android;
Kolay gelsin   Bu konuyu bizimle paylaşan Tuğrul HELVACI  hocamıza teşekkür ederim. DelphiForumu.com'dan alıntıdır. Orjinal KonuAndroid ortamındaki tüm kütüphaneler henüz Delphi tarafından implemente edilmiş durumda değil. Ancak; ilgili sınıfları delphi ortamına implemente etmek genellikle çok da zor olmuyor. Bunun için d.android.com adresinden ilgili sınıfı bulup; öncelikle sınıf içinde static olan metodların varlığını kontrol etmelisiniz. Bunları bir köşeye not edin, ardından sınıf içinde constant(sabit) olarak tanımlı olan değişkenleri bulun, bunları da bir köşeye not edin. Şimdi not ettiğiniz static metodlar ve const sabitler için bir sınıf tanımlamalısınız. Kısaca bir örnek vermek gerekir ise; d.android.com'dan Toast sınıfını inceleyelim; (http://developer.android.com/reference/android/widget/Toast.html) java.lang.Object ↳ android.widget.Toast Gördüğünüz gibi sınıf, Object sınıfından türetilmiş. Demekki bizde Delphi tarafında Java Object sınıfından türeteceğiz sınıfımızı. Const bölümündeki tanımlarımıza da bakalım; int LENGTH_LONG Show the view or text notification for a long period of time. int LENGTH_SHORT Show the view or text notification for a short period of time. Görüldüğü üzere iki adet sabit tanım mevcut. Şimdi static metodlarımızı arayalım. static Toast makeText(Context context, int resId, int duration) Make a standard toast that just contains a text view with the text from a resource. static Toast makeText(Context context, CharSequence text, int duration) Make a standard toast that just contains a text view. Yukarıda görüldüğü gibi 2 adet static metodumuz var. Yazımın başında da belirttiğim gibi, static olan metodları ve sabit tanımları bir sınıf içinde yazacaktık. Hadi onu yazalım;
JToast = interface;

JToastClass = interface(JObjectClass)
['{Ctrl+Shift+G ye basınız}']
function GetLengthLong : Integer; cdecl;
function GetLengthShort : Integer; cdecl;

function makeText(Context : JContext; ResID : Integer; Duration : Integer) : JToast; cdecl;
function makeText(Context : JContext; Text : JCharSequence; Duration : Integer) : JToast; cdecl;

property LENGTH_LONG : Integer read GetLengthLong;
property LENGTH_SHORT: Integer read GetLengthShort;
end;
d.android.com da Toast sınıfı içindeki istediğimiz sabit tanımları ve static metodları bulup yukarıdaki interface'de implemente ettik. Dikkatinizi çekeceği gibi, interface'imiz JObjectClass interface'inden türüyor. Bunun sebebi Toast android sınıfının da Java Object sınıfından türüyor olması idi. Eğer Toast java domates sınıfından türüyor olsa idi, bu durumda bizim interface'imiz de JDomatesClass gibi bir interface'den türeyecekti. Delphi'ciler pek çok sınıfı bizim için implemente etmişler ama JDomatesClass gibi bir tanımlama bulamıyorsanız bu durumda o interface'i de sizin implemente etmeniz icap edecekti. Neyseki buna pek gerek kalmıyor. Ardından; dikkat çeken başka bir nokta ise; metodların cdecl ile işaretlenmesi gerekliliği. Şimdi hızlıca ilerlemeye devam edelim. Henüz işimiz bitmedi. Şimdi JToast interface'ini implemente etmeliyiz.
[JavaSignature('android/widget/Toast')]
JToast = interface(JObject)
['{Ctrl+Shift+G ye basınız}']
procedure cancel; cdecl;
function getDuration : Integer; cdecl;
function getHorizontalMargin : Single; cdecl;
..
..
..
end;
Yukarıdaki interface'imizde ise en önemli nokta JavaSignature attribute'si. İlgili interface'i bu attribute ile işaretliyoruz. Peki JavaSignature attributesi içindeki 'android/widget/Toast' da neyin nesi diyebilirsiniz. O da d.android.com 'da Toast yardımında görebileceğiniz gibi ilgili sınıfın hiyerarşisini gösteriyor. (java.lang.Object ↳ android.widget.Toast) Yine yukarıdaki interface'de dikkatinizi çekmiştir, java'da void olan dönüş türleri bir şey dönmeyecek anlamına gelir, Delphi'de de bu procedure ile temsil edildiğinden cancel metodu procedure olarak tanımlanmıştır. Ayrıca belirtmek isterim ki, android sınıfının içindeki tüm metodları implemente etmek zorunda değilsiniz, sadece ilgilendiklerinizi implemente edebilirsiniz. Henüz test etmedim ama büyük ihtimalle büyük-küçük harf ayrımına da dikkat etmeniz faydalı olacaktır. Şimdi son aşamaya geldik. Malumunuz olduğu üzere, Delphi'de herhangi bir interface'i direkt olarak create edemiyoruz. Bu interface'i implemente edecek bir sınıfa ihtiyacımız var. İlgili interface'e o sınıf instance'ı üzerinden erişim sağlayacağız. Bu vesile ile son adım olarak bir de sınıf deklare etmemiz gerekiyor. Hadi onu da yazalım;
TSucukluTost = class(TJavaGenericImport<JToastClass, JToast>)
end;
İşte bu kadar basit; artık kodlarımız içinden TSucukluTost.JavaClass.makeText(SharedActivityContext, StrToJCharSequence('Deneme'), TJToast.JavaClass.LENGTH_SHORT).show; biçiminde kullanabiliriz. Diğer sınıflar elbette bundan çok daha karmaşık olacaktır, ancak benzer adımları izleyerek sonuçlara ulaşabilirsiniz. Tabii bir çok java nesnesinin delphi'cesinin yazıldığı ilgili unitleri'de uses ile eklemeyi unutmamalısınız. Örneğin;
Androidapi.JNIBridge,
Androidapi.JNI.JavaTypes,
Androidapi.JNI.GraphicsContentViewText,
FMX.Helpers.Android;
Kolay gelsin   Bu konuyu bizimle paylaşan Tuğrul HELVACI  hocamıza teşekkür ederim. DelphiForumu.com'dan alıntıdır. Orjinal Konu

Hiç yorum yok:

Yorum Gönder