Translate

1 Temmuz 2013 Pazartesi

Starting Another Activity - Başka Bir Activity Başlatma

Starting Another Activity - Başka Bir Activity Başlatma

Önceki yayınımızdaki işlemleri tamamladığınızda bir butona ve textfield a sahip bir activity gösteren bir uygulama yapmış oldunuz. Bu yayınımızda MainActivity'ye yeni kodlar ekleyerek gönder butonuna bastığınızda yeni bir activity'yi nasıl başlatacağınızdan bahsedeceğiz.


Gönder Butonuna Cevap verme
Gönder butonuna basıldığında on-click olayına bir cevap vermek için, activity_main.xml layout'unu açarak <Button> elemanına android:onClick özelliği eklenir:

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/button_send"
    android:onClick="sendMessage" />
android:onClick özelliğinin değeri "sendMessage" kullanıcının butona tıkladığı zaman sistem tarafından çağrılan ve activity'nizde bulunan bir metodun ismidir.

Bu değere karşılık oluşturmak için src/ klasörü altında bulunan MainActivity sınıfını açıp bu metodu aşağıdaki gibi eklemeniz gerekmektedir.

/** Called when the user clicks the Send button */
public void sendMessage(View view) {
    // Do something in response to button
}
Bu işlemi yaptığınızda sınıfınıza View sınıfını da import etmeniz gerekmektedir:

import android.view.View;
İpucu: Eksik import işlemlerini yapmak için Eclipse'de Ctrl + Shift + O tuşlarına birlikte basmanız yeterli olacaktır.

Bu metodun android:onClick özelliğinde verilen isimle eşleşmesi için bütün özelliklerin aşağıda verildiği gibi olması gerekmektedir:
  • Public olmalı
  • Return değerinin void olması gerekli
  • Parametre olarak sadece View almalı (Tıklandığında bu bir View oluşturacak)
Daha sonra bu metodu doldurarak textfield içeriğini okuyup içinde bulunan metni başka bir activity ekranına gönderebileceksiniz.

Bir Intent oluşturma

Intent farklı bileşenler arasında (İki activity gibi) çalışma zamanı bağlayıcısı (runtime binding) olarak kullanılan bir nesnedir. Intent bir uygulamanın yapmak istediği şeyi yani uygulamanın niyetini temsil eder. Intent'ler çok değişik türdeki görevleri yerine getirmek için kullanılabilirler fakat genelde başka bir activity'yi başlatmak için kullanılırlar.

DisplayMessageActivity adında başka bir activity'yi başlatmak için sendMessage() metodunun içinde bir Intent oluşturalım:

Intent intent = new Intent(this, DisplayMessageActivity.class);
Burada kullanılan konstraktır iki parametre almaktadır:
  • Birinci parametre bir Context'dir (Activity sınıfı bir Context alt sınıfı olduğundan this değeri kullanılmıştır)
  • Burada kullanılan ikinci parametre değeri ise sistem Intent'i kime teslim edecekse ona ait uygulama bileşeni sınıfı(class) dır.(Burada başlatılacak activity'ye ait sınıftır.)
Not: DisplayMessageActivity' ye bir referans tanımlamak eğer Eclipse gibi bir ide kullanıyorsanız bu sınıf hali hazırda mevcut olmadığı için hataya sebep olacaktır. Bu hatayı görmezden gelin. En kısa zamanda bu sınıfı ekleyeceğiz.

Diğer uygulamalara bir intent yollama
Buraya kadar bahsettiğimiz intent açık bir intent'di, Çünkü bir Intent önderilmesi gereken yere tam bir uygulama bileşeni oluşturur. Ancak Intent'ler, Intent'in bir bileşeni istediğini belirtmediğinde fakat değişik Intent  parametrelerinde belirlenmiş action'lar için meta-data özellikleri karşılandığı sürece cihazda yüklü herhangi bir uygulamaya izin verdiği zaman üstü kapalı da olabilir. Daha sonra uygulamaların kendi aralarında haberleşmesi konusunda bir yayın oluşturulacaktır.
Bir intent sadece yeni bir activity başlatmanızı sağlamaz aynı zamanda activity'ye bir dolu veri de taşıyabilir. sendMessage() metodunun içerisinde, EditText elemanını almak ve ona ait metin içeriğini Intent'e eklemek için findViewById() kullanın:

Intent intent = new Intent(this, DisplayMessageActivity.class);
EditText editText = (EditText) findViewById(R.id.edit_message);
String message = editText.getText().toString();
intent.putExtra(EXTRA_MESSAGE, message);
Not: Şimdi android.content.Intent ve android.widget.EditText importlarını eklemeniz gerekir. Biraz sonra EXTRA_MESSAGE sabitini tanımlayacağız.

Bir Intent extra diye adlandırılan çok çeşitli veri tiplerine ait bir veri koleksiyonunu taşıyabilir. putExtra() metodu ilk parametre olarak anahtar ismini ve ikinci parametre olarak ise değeri alır. 

Bir sonraki activity extra veri sorgulayacağı için, intentiniz için public sabitini kullanan bir anahtar tanımlamalısınız, Bu yüzden MainActivity sınıfının üzerine EXTRA_MESSAGE ekleyin:


public class MainActivity extends Activity {
    public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";
    ...
}
Genelde kullanılacak intentler için key tanımlarket ön ek olarak uygulamanızın paket ismini kullanmak güzel bir yöntem olarak kabul edilir. Bu durum eğer uygulamanız başka bir uygulama ile haberleşecek olursa keylerinizin benzersiz olmasını garanti eder. 

İkinci bir activity başlatma

Bir activity başlatmak için, startActivity()' yi çağırın ve bunu Intent'e geçirin. Sistem bu çağrıyı alır ve Intetnt tarafından belirlenen activity'nin bir örneğini başlatır. 

Bu yeni kodla gönder butonu tarafından çağrılacak olan sendMessage() metodu tamamlanmış olur:

/** Called when the user clicks the Send button */
public void sendMessage(View view) {
    Intent intent = new Intent(this, DisplayMessageActivity.class);
    EditText editText = (EditText) findViewById(R.id.edit_message);
    String message = editText.getText().toString();
    intent.putExtra(EXTRA_MESSAGE, message);
    startActivity(intent);
}

Şimdi bunların çalışması için DisplayMessageActivity sınıfının oluturulması gerekli.

İkinci Bir Activity Oluşturmak

Resim 1. Eclipse için yeni activity sihirbazı.
Eclipse kullanarak yeni bir activity oluşturmak için: 
  1. Araç çubuğundan new'i tıklayın
  2. Açılan pencerede, Android klasörünü açın ve Android Activity'yi seçin. Next'i tıklayın.
  3. BlankActivity'yi seçin ve Next'i tıklayın.
  4. Activity aytıntılarını doldurun:
    • Project: MyFirstApp
    • ActivityName: DisplayMessageActivity
    • Layout Name: activity_display_message
    • Title: My Message
    • Hierarchical Parent: com.example.myfirstapp.MainActivity
    • Navigation Type: None
Next'i tıklayın.

DisplayMessageActivity.java dosyasını açın.

  • Bu sınıfın gerekli olan onCreate() metodunu zaten implement ettiğini göreceksiniz.
  • Aynı zamanda onCreateOptionsMenu() metodunun da implement edildiğini görüyorsunuz, fakat bu uygulamada buna ihtiyaç duymadığımız için bu implementi olduğu gibi kaldırabilirsiniz.
  • Aynı zamanda onCreateOptionMenu() de implement edilmiş. bu işlem çubuğunun yukarı davranışı için davranışlar tutar. Bu şekilde kalsın silmeyin.
ActionBar APIleri sadece HONEYCOMB (API seviye 11) ve üzerinde bulunduğundan platform versiyonunu anlamak için getActionBar() metodu etrafına bir şart eklememiz gerekir. Ek olarak, lint hatalarından kaçınmak için@SuppressLint("NewApi") tagı onCreate() metotuna eklenmelidir.

DisplayMessageActivity sınıfı aşağıdaki gibi görüntülenmelidir:

public class DisplayMessageActivity extends Activity {

    @SuppressLint("NewApi")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_display_message);

        // Make sure we're running on Honeycomb or higher to use ActionBar APIs
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            // Show the Up button in the action bar.
            getActionBar().setDisplayHomeAsUpEnabled(true);
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:
            NavUtils.navigateUpFromSameTask(this);
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}
Activity sınıflarının tamamında onCreate() motodunun implement edilmesi gerekmektedir. Activity'den yeni bir instans üretilir üretilmez sistem bu metodu çağırır. Bu metod setContentView() metodu ile activity layoutunuzu tanımlamanız gereken ve activity bileşenleri için başlangıç ayarlarını uygulamanız gereken yerdir. 

Uygulama şu an çalıştırılabilir. Eğer gönder butonuna basarsanız şablon tarafından sağlanan ve Hello World mesajını veren ikinci activity başlar. Aşağıda bu mesajı birinci activity den bir intent yardımı ile gönderilen mesajla nasıl değiştirileceği anlatılmıştır.

Intent alma

Kullanıcının nasıl oraya vardığına bakmadan her Activity bir Intent ile çağrılır. Uygulamayı başlatan Intent'i getIntent() metodunu çağırarak alabilirsiniz ve Intent içinde bulunan veriyi kullanabilirsiniz.

DisplayMessageActivity sınıfının onCreate() metodunda, MainActivity tarafından dağıtılan Intent'i alın ve içindeki mesajı açın:

Intent intent = getIntent();
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

Mesajı Görüntüleme

Mesajı ekranda göstermek için, bir TextView aracı oluşturun ve setText() kullanarak metni ayarlayın. Daha sonra setContentView()'e geçirerek activity layout'unun kök görünümüne TextView ekleyin.

DisplayMessageActivity için onCreate() metodunun son hali aşağıdaki gibi olmalıdır:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Get the message from the intent
    Intent intent = getIntent();
    String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

    // Create the text view
    TextView textView = new TextView(this);
    textView.setTextSize(40);
    textView.setText(message);

    // Set the text view as the activity layout
    setContentView(textView);
}
Şimdi uygulamayı çalıştırabilirsiniz. Uygulama açıldığında, textfield içine bir mesaj yazın, gönder butonuna tıklayın ve mesaj ikinci activity' de belirecektir.

Resim 2. Uygulama bittiğinde iki activity ekranının görüntüsü.
İşte hepsi bukadar, ilk uygulamanızı yapmış oldunuz.

Daha fazla bilgi edinmek için sonraki yayınlarımızı takip edebilirsiniz.

2 yorum:

  1. Teşekkürler güzel yazı.
    mesela bir B activitide A listview i var. bunda x=1,y=1,z=0 itemleri var. bu itemlerden bağımsız olarak bir buttona custom bir dialog oluşturdum dialog içinde de bir edittext var. Bu edit text'e ben Z=1 yazıdım düzenle buttonuma bastım. B activitydeki A listview deki Z00 olan itemin Z01 olmasını istiyorum. Bunu nasıl yaparım?

    YanıtlaSil
  2. Teşekkürler güzel yazı.
    mesela bir B activitide A listview i var. bunda x=1,y=1,z=0 itemleri var. bu itemlerden bağımsız olarak bir buttona custom bir dialog oluşturdum dialog içinde de bir edittext var. Bu edit text'e ben Z=1 yazıdım düzenle buttonuma bastım. B activitydeki A listview deki Z00 olan itemin Z01 olmasını istiyorum. Bunu nasıl yaparım?

    YanıtlaSil