Kotlin Nedir?

Google’ın 2017’deki son etkinliğinde resmen duyurusunu yaptığı KOTLIN, yazılım dünyasında deprem etkisi yaptı. Özellikle hali hazırda Java ile Android uygulaması geliştirenlerin çoğu bu haberi heyecan ve endişeyle karşıladı. Aykut Taşdelen yol sohbetlerinde Kotlin’in aslında çok da yeni bir gelişme olmadığını yaklaşık 1 yıldır gündeminde olduğunu ve Kotlin’e dair görüşlerini anlatıyor. Java mı daha iyi, Kotlin mi? Kotlin’e geçmeli miyim? Java’nın sonu mu geldi? gibi çeşitli sorulara bu video’da cevaplar bulacaksınız.

Reklamlar

Android ConstraintLayout

Aşağıdaki yazı Android Programlama Eğitimi kitabımın 3. baskısından bir alıntı olup izinsiz kopyalanamaz.

ConstraintLayout, Google I/O 2016 etkinliğinde tanıtılan yeni özelliklerden belki de en dikkate değer olanı. Zira bu layout nesnesi ile görsel tasarım hem daha kolay geliyor, hem de ezeli rakip iOS’tan ironik bir alıntı yapılmış oluyor. ConstraintLayout, özellikle RelativeLayout ile yaşanan bazı sorunlara çare olabilmesi amacıyla düşünülmüş. Örneğin yüzdelik değerlerin verilebilmesi ve iç içe (nested) layout kullanımı nedeniyle oluşan karmaşıklığın azaltılması gibi. Unbundled bir kütüphane olması nedeniyle de API-9‘a kadar geriye uyumlu yani çok eski versiyonlarda bile kullanılabilecek özellik.

Dikkat: Bu özelliğin kullanımı Android Studio 2.2 gerektirmektedir. Bu başlık, kitabın 3. baskısının yazıldığı günlerde Android Studio 2.2 preview2 versiyonu ile hazırlanmıştır. Dolayısıyla gerçek sürümde olası bir takım değişiklikler gündeme gelebilir. Bu gerekçeyle konuya başlangıç seviyesinde değinilmiştir.

Bu layout üzerine paletten herhangi bir UI elemanı (örneğin buton) sürüklenip bırakıldığında henüz hiç bir constraint’e (kısıtlamaya) sahip olmayacaktır. Constraint oluşturmak için “buton seçili durumdayken” etrafındaki küçük yuvarlaklardan herhangi bir yöne sürükle-bırak işlemi yapılırsa örneğin (activity’nin üst kenarına) bir constraint otomatik olarak oluşur.

android-contraint1

Aşağıdaki kod bu yöntemle oluşturulmuş butona ait üç farklı constraint’i göstermektedir. Activity’nin üst, alt ve sol kenarına göre butona constraint’ler eklenmiştir. CheckBox’ın ise üst kenarı activity’e göre alt kenarı ise butona göre konumlandırılmıştır.

 

<?xml version=”1.0″ encoding=”utf-8″?>
<android.support.constraint.ConstraintLayout       xmlns:android=”http://schemas.android.com/apk/res/android&#8221;
xmlns:app=”http://schemas.android.com/apk/res-auto&#8221;
xmlns:tools=”http://schemas.android.com/tools&#8221;
android:id=”@+id/act”
android:layout_width=”match_parent”
android:layout_height=”match_parent”
tools:context=”org.android.dernegi.MainActivity”>

<Button       android:id=”@+id/btn”
android:text=”Deneme”
android:layout_width=”100dp”
android:layout_height=”80dp”
android:backgroundTint=”#ec0404″
android:layout_marginStart=”96dp”
android:layout_marginTop=”120dp”
android:layout_marginBottom=”16dp”
app:layout_constraintVertical_bias=”0.66″        app:layout_constraintLeft_toLeftOf=”@+id/ç”
app:layout_constraintTop_toTopOf=”@+id/act ”       app:layout_constraintBottom_toBottomOf=”@+id/act ”   />    <CheckBox
android:text=”CheckBox”
android:layout_width=”136dp”
android:layout_height=”46dp”       android:layout_marginTop=”16dp”
android:layout_marginBottom=”8dp”      tools:layout_editor_absoluteX=”208dp”
android:id=”@+id/chk”
app:layout_constraintTop_toTopOf=”@+id/act”
app:layout_constraintBottom_toTopOf=”@+id/btn”
/>
</android.support.constraint.ConstraintLayout>

android-contarint-2

Araç çubuğuna at detaylara değinmek gerekirse U mıknatıs işaretli düğme; autoconnect özelliğine aktif/pasif hale getirmekte. X işaretli düğme; oluşturulmuş constraint’leri silmekte, ampul işaretli düğme ise seçili elemanın editördeki konumuna göre constraint’leri otomatik olarak eklemektedir.

WindowsPhone FM Radio

Windows Phone’un ilginç özelliklerinden birisi de bu. Android ve iOS ‘ta olmayan bu özellik Windows Phone’ların donanımsal olarak aynı zamanda bir radyo alıcısına sahip olması. İşte programatik olarak kullanımı:

FMRadio rd = FMRadio.Instance;
rd.PowerMode = RadioPowerMode.On;
rd.Frequency = 90.8;
rd.CurrentRegion = RadioRegion.Europe;

Android Library Module Oluşturmak ve Kullanmak

Kaynakça: “Android Programlama Eğitimi” Kitabı Aykut Taşdelen Pusula Yayıncılık

Geliştiriciler birden fazla projede kullanabilecekleri çeşitli kodlar yazma ve kodları paketleme ihtiyacı duymaktadırlar. Sözgelimi .NET ortamında uygulama geliştiren bir kişi bu amaca hizmeten “.dll” dosyaları oluşturur ve bu dosyaları farklı projelere referanse ederek kullanır. Benzer şekilde Java uygulaması yazan geliştiriciler de “.jar” uzantılı dosyalar oluştururlar.

Android ortamında ise aynı amaç için “.aar” dosyaları söz konusudur. Aslında bu dosyalar bir tür sıkıştırılmış dosyalardır ve uzantıları “.zip” şeklinde değiştirilecek olursa içeriği gözlemlenebilir.

Module0

aar” dosyalarının içeriği sadece kaynak kodlardan ibaret değildir. Söz konusu kütüphanenin kendisinin kullandığı başka kütüphaneler, resource’lar, manifest, asset’ler gibi farklı unsurlar da olabilmektedir.

Module Oluşturma ve Kullanma

Bir Android projesine yeni bir module eklemek için “File > New > New Module” menü seçenekleri kullanılmalıdır.

Module1

İlk ekrandan “Android Library” seçeneği seçildiğinde isimlerin ve SDK versiyonunun belirlenmesine yönelik ikinci bir ekran daha açılacaktır. Bu ekrandaki bilgiler geliştiricinin amaçlarına göre doldurulmalıdır.

Module2

Bu şekilde oluşturulacak olan yeni modülün (örnekteki samplelib) içeriği Android görünümünde izlenebilir ve yeni dosyalar eklenilebilir. Sözgelimi örnekte Gui isimli bir sınıf dosyası eklenmiş ve aşağıda görüldüğü gibi kodlanmıştır.

package android.dernegi.org.samplelib;

import android.content.Context;
import android.widget.Toast;

public class Gui 
{
    private Context context;
    
    public Gui(Context context) 
    {
        this.context = context;
    }
    
    public void ToastShow(String message)
    {
        Toast.makeText(context, message, Toast.LENGTH_LONG).show();
    }
}

Module3

 

Yukarıda anlatıldığı şekilde oluşturulan bir modün hedef projede kullanılabilmesi için söz konusu projeye referanse edilmesi gerekir. Bu işlem Android terminolojisinde dependency (bağımlılık) eklemek şeklinde anılmaktadır. Bu noktada “Open Module Settings” seçeneği ile “Project Structure” penceresi açılmalı ve “+” sembolü kullanılarak bir module tipi dependency eklenmelidir. Örnekte bu yöntemle hedef projeye “samplelib” isimli module eklenmiştir.

Module4

Bu aşamadan itibaren artık Gui isimli sınıf hedef projede kullanılabilir. Örneğin;

package android.dernegi.org.consumerapp;

import android.dernegi.org.samplelib.Gui;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity 
{
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Gui gui = new Gui(this);
        gui.ToastShow("Android Programcıları Derneği");
    }
}

Module’ün Farklı Bir Projede Kullanılması

Genellikle yapılmak istenilen şey; bir modülün oluşturulduğu projeden farklı bir projede kullanılmasıdır. Oysa yukarıdaki örnekte önce ConsumerApp isimli bir proje açılmış daha sonra bir modüle eklenmiş (SampleLib) ve son kertede de ConsumerApp projesine referanse edilerek kullanılmıştı. Bu başlıkta ise aynı modülün tümüyle farklı bir projede nasıl kullanılabileceği konu edilmektedir.

Sözgelimi OtherApp isimli farklı bir Android projesi başlatılmış olsun. Öncelikle eğer yoksa libs isimli bir dizin açılmalı ve içerisine SampleLib’e ait “aar” dosyası kopyalanmalıdır.

İpucu : SampleLib’e ait “aar” dosyasının path’i; “…/ConsumerApp/samplelib/build/outputs/aar/samplelib-release.aar”

Module5

Kopyalama sonrasında tercihen rename işlemi yapılabilir. (Örnekte samplelib.aar şeklinde isim kısaltılmıştır.) Daha sonra build.gradle dosyasında “libs” dizini bir “file system repository” olarak bildirilmelidir.

repositories {
    flatDir {
        dirs 'libs'
    }
}

Bu işlemin yapıldıktan sonra aşağıdaki gibi “aar” dosyası bir dependency olarak eklenebilir (referanse edilebilir).

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile(name:'samplelib', ext:'aar')
}

Gradle senkronizasyonu gerçekleştirildikten sonra artık SampleLib::Gui sınıfı kullanılabilir. Örneğin:

package android.dernegi.org.otherapp;

import android.dernegi.org.samplelib.Gui;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity 
{
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Gui gui = new Gui(this);
        gui.ToastShow("Android Programlama Eğitimi/Pusula Yayıncılık");
    }
}