Anasayfa Mobil Android Programlama Ders 33: RequestCode ve ResultCode

Android Programlama Ders 33: RequestCode ve ResultCode

Android Programlama Ders 33’te geçen derste gördüğümüz requestCode ve resultCode parametrelerini projeyi kullanarak daha ayrıntılı inceleyeceğiz.

Geçen derslerimizde etkileşimi kullanarak sonucu almayı öğrendik. Bu olayı daha ayrıntılı araştıralım. Yeni proje oluşturacağız. Projede iki etkileşim (Activity) bize sonucu gönderecek. Etkileşimden gelen sonuç onActivityResult metodunda işleniyor. requestCode parametresi farklı etkileşimlerden gelen sonuçları ayırmak için kullanılıyor. Ve resultCode parametresi çağırmanın başarılı olup olmadığını belirtmek için kullanılıyor. Yeni bir proje açalım:

  • Project name: P0033_ActivityResult
  • Build Target: Android 4.2
  • Application name: ActivityResult
  • Package name: tr.example.activityresult
  • Create Activity: MainActivity

Main.xml dosyayı açalım ve aşağıdaki kodu kopyalayalım:

<?xml version="1.0" encoding="utf-8"?>
 <LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="vertical">
 <TextView
  android:id="@+id/tvText"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:layout_marginTop="20dp"
  android:gravity="center_horizontal"
  android:text="Hello World"
  android:textSize="20sp">
 </TextView>
 <LinearLayout
  android:id="@+id/linearLayout1"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_margin="20dp"
  android:orientation="horizontal">
 <Button
  android:id="@+id/btnColor"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_marginRight="5dp"
  android:layout_weight="1"
  android:text="Color">
 </Button>
 <Button
  android:id="@+id/btnAlign"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_marginLeft="5dp"
  android:layout_weight="1"
  android:text="Alignment">
 </Button>
 </LinearLayout>
 </LinearLayout>

Ekranda bir tane TextView (Hello World metni içerecek) olacak. İlk buton rengi seçmek ve ikincisi metni dizmek için. Butona basıldığı zaman seçim yapmak için etkileşimi (Activity) çağıracak. MainActivity.java’yı oluşturalım:

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener {

  TextView tvText;
  Button btnColor;
  Button btnAlign;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        tvText = (TextView) findViewById(R.id.tvText);

        btnColor = (Button) findViewById(R.id.btnColor);
        btnAlign = (Button) findViewById(R.id.btnAlign);

        btnColor.setOnClickListener(this);
        btnAlign.setOnClickListener(this);

    }

  @Override
  public void onClick(View v) {
    // TODO Auto-generated method stub

  }
}

Ekranda bulunan nesneleri belirttik ve butonlara işletici bağladık. Boş kalan onClick metodunu biraz sonra dolduracağız. İki etkileşimi oluşturalım. İlk etkileşim (ColorActivity) rengi değiştirecek. ColorActivity için layout dosyayı oluşturalım. İsmi color.xml olsun:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="horizontal">
<Button
 android:id="@+id/btnRed"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_margin="5dp"
 android:layout_weight="1"
 android:text="Red">
</Button>
<Button
 android:id="@+id/btnGreen"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_margin="5dp"
 android:layout_weight="1"
 android:text="Green">
</Button>
<Button
 android:id="@+id/btnBlue"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_margin="5dp"
 android:layout_weight="1"
 android:text="Blue">
</Button>
</LinearLayout>

ColorActivity.java oluşturalım:

import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class ColorActivity extends Activity implements OnClickListener {

  Button btnRed;
  Button btnGreen;
  Button btnBlue;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.color);

    btnRed = (Button) findViewById(R.id.btnRed);
    btnGreen = (Button) findViewById(R.id.btnGreen);
    btnBlue = (Button) findViewById(R.id.btnBlue);

    btnRed.setOnClickListener(this);
    btnGreen.setOnClickListener(this);
    btnBlue.setOnClickListener(this);
  }

  @Override
  public void onClick(View v) {
    Intent intent = new Intent();
    switch (v.getId()) {
    case R.id.btnRed:
      intent.putExtra("color", Color.RED);
      break;
    case R.id.btnGreen:
      intent.putExtra("color", Color.GREEN);
      break;
    case R.id.btnBlue:
      intent.putExtra("color", Color.BLUE);
      break;
    }
    setResult(RESULT_OK, intent);
    finish();
  }
}

Ekrandaki bulunan bileşenleri belirtiyoruz. Butonlara işletici (this) bağlıyoruz. OnClick metodunda Intent’i oluşturuyoruz ve v.getID () metodu kullanarak basılan butonu buluyoruz.  Intent’e “color”- ismi ve renginin değeri (Color.Red, Color.Green,Color.Blue) yerleştiriyoruz. setResult metodu kullanarak statüsü RESULT_OK ve sonuç olarak intent nesneyi kullanacağımızı belirtiyoruz. Etkileşimi kapatıyoruz (finish ()). Renkleri kullanmak için sistemde bulunan değerleri kullanacağız. Aynı şekilde ikinci etkileşimi oluşturuyoruz. AlignActivity için layout dosyayı oluşturalım. İsmi align.xml olsun:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="horizontal">
<Button
 android:id="@+id/btnLeft"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_margin="5dp"
 android:layout_weight="1"
 android:text="Left">
</Button>
<Button
 android:id="@+id/btnCenter"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_margin="5dp"
 android:layout_weight="1"
 android:text="Center">
</Button>
<Button
 android:id="@+id/btnRight"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_margin="5dp"
 android:layout_weight="1"
 android:text="Right">
</Button>
</LinearLayout>

AlignActivity.java oluşturalım:

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class AlignActivity extends Activity implements OnClickListener {

  Button btnLeft;
  Button btnCenter;
  Button btnRight;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.align);

    btnLeft = (Button) findViewById(R.id.btnLeft);
    btnCenter = (Button) findViewById(R.id.btnCenter);
    btnRight = (Button) findViewById(R.id.btnRight);

    btnLeft.setOnClickListener(this);
    btnCenter.setOnClickListener(this);
    btnRight.setOnClickListener(this);
  }

  @Override
  public void onClick(View v) {
    Intent intent = new Intent();
    switch (v.getId()) {
    case R.id.btnLeft:
      intent.putExtra("alignment", Gravity.LEFT);
      break;
    case R.id.btnCenter:
      intent.putExtra("alignment", Gravity.CENTER);
      break;
    case R.id.btnRight:
      intent.putExtra("alignment", Gravity.RIGHT);
      break;
    }
    setResult(RESULT_OK, intent);
    finish();
  }
}

Bu kod ColorActivity gibi, tek farkı burada rengi değil metnin pozisyonunu değiştiriyoruz. İki etkileşimi de Manifest dosyasında kaydetmeyi unutmuyoruz. Şimdi MainActivity.java dosyasını bitirebiliriz. requestCode olarak iki değişkeni kullanacağız:

final int REQUEST_CODE_COLOR = 1;
final int REQUEST_CODE_ALIGN = 2;

OnClick metodu dolduralım:

@Override
  public void onClick(View v) {
    Intent intent;
    switch (v.getId()) {
    case R.id.btnColor:
      intent = new Intent(this, ColorActivity.class);
      startActivityForResult(intent, REQUEST_CODE_COLOR);
      break;
    case R.id.btnAlign:
      intent = new Intent(this, AlignActivity.class);
      startActivityForResult(intent, REQUEST_CODE_ALIGN);
      break;
    }
  }

OnClick metodunda basılan butonu buluyoruz ve sonucu almak için Intent’i gönderiyoruz. startActivityForResult metodunda iki çağrı arasında farkı çağrılan klastan (ColorActivity veya AlignActivity) ve requestCode parametrelerden oluşuyor. ColorActivity etkileşimi çağırdığımız zaman REQUEST_CODE_COLOR ve AlignActivity etkileşimde REQUEST_CODE_ALIGN kullanıyoruz. Bu değişkenleri kullanarak onActivityResult metoduna gelen sonucun hangi etkileşimden geldiğini bulabiliriz. MainActivity.java dosyasında onActivityResult metodu oluşturalım:

@Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // requestCode ve resultCode loga kaydedelim
    Log.d("myLogs", "requestCode = " + requestCode + ", resultCode = " + resultCode);
    //OK geldigi zaman
    if (resultCode == RESULT_OK) {
      switch (requestCode) {
      case REQUEST_CODE_COLOR:
        int color = data.getIntExtra("color", Color.WHITE);
        tvText.setTextColor(color);
        break;
      case REQUEST_CODE_ALIGN:
        int align = data.getIntExtra("alignment", Gravity.LEFT);
        tvText.setGravity(align);
        break;
      }
    // OK gelmedigi zaman
    } else {
      Toast.makeText(this, "Wrong result", Toast.LENGTH_SHORT).show();
    }
  }

Uygulamanın çalışmasını daha iyi anlamak için bildirimi (Log.d) kullanacağız. Bildirime requestCode ve resultCode parametrelerinin değerini yazdıracağız. ColorActivity ve AlignActivity etkileşimde setResult metodunda RESULT_OK statüsü yerleştiriyorduk. Bu demektir ki onActivityResult metodunda RESULT_OK çağrısının başarılı olup olmadığını ifade edecek. Çağrı başarılı olduğu zaman (resultCode = RESULT_OK) requestCode parametresine bakıyoruz. requestCode REQUEST_CODE_COLOR’a eşit olduğu zaman etkileşime sonucu gönderdiğini ifade ediyor. Intent’i  (data) kullanarak “color” isimli nesneyi alıyoruz ve değeri TextView’e yerleştiriyoruz. Color.WHITE getInExtra metodunda varsayılan parametre olarak kullanılıyor. Yani eğer Intent  “color” ismi nesneyi bulamıyorsa beyaz (WHITE) rengi kullanılacak. Aynı olay REQUEST_CODE_ALIGN için de geçerlidir. Eğer resultCode RESULT_OK’ye eşit değilse demek ki hata oluştu. Böyle bir olay oluştuğu zaman ekrana “Wrong result” mesajı göndereceğiz. Ekranda seçim yapmadan geri (Back) butonuna bastığı zaman böyle bir olay karşımıza çıkabilir. Uygulamayı kaydedelim ve çalıştıralım: hello world Color butonuna basıyoruz: color Mesela kırmızı (Red) rengi seçelim: red Bildirime bakıyoruz: log requestCode = 1, resultCode = -1 onActivityResult metodunda gelen requestCode bire eşit. Çünkü etkileşimi çağırmak için REQUEST_CODE_COLOR kullandık. resultCode = -1 sistemin  RESULT_OK değeri. Rengi seçtiğimiz zaman cevap olarak statüsü eşit RESULT_OK geldi. Alignment butonuna basıyoruz ve Right seçeneği seçiyoruz: right Bildirime bakıyoruz: requestCode = 2, resultCode = -1 onActivityResult metodunda gelen requestCode eşit iki. Çünkü etkileşimi çağırmak için REQUEST_CODE_ALIGN kullandık. resultCode = -1, yani RESULT_OK. Color butonuna basıyoruz ve geri (Back) butonuna basıyoruz: wrong result Hata olduğunu mesajdan görüyoruz. Bildirime bakalım: requestCode = 1, resultCode = 0   requestCode = 1 – doğru “Color” butonuna bastık (REQUEST_CODE_COLOR) resultCode = 0,  RESULT_CANCELED, değeri demek ki çağrı başarısızlıkla sonuçlandı. MainActivity.java dosyanın kodu:

import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {

  final int REQUEST_CODE_COLOR = 1;
  final int REQUEST_CODE_ALIGN = 2;

  TextView tvText;
  Button btnColor;
  Button btnAlign;

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    tvText = (TextView) findViewById(R.id.tvText);

    btnColor = (Button) findViewById(R.id.btnColor);
    btnAlign = (Button) findViewById(R.id.btnAlign);

    btnColor.setOnClickListener(this);
    btnAlign.setOnClickListener(this);
  }

  @Override
  public void onClick(View v) {
    Intent intent;
    switch (v.getId()) {
    case R.id.btnColor:
      intent = new Intent(this, ColorActivity.class);
      startActivityForResult(intent, REQUEST_CODE_COLOR);
      break;
    case R.id.btnAlign:
      intent = new Intent(this, AlignActivity.class);
      startActivityForResult(intent, REQUEST_CODE_ALIGN);
      break;
    }
  }

  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    Log.d("myLogs", "requestCode = " + requestCode + ", resultCode = " + resultCode);

    if (resultCode == RESULT_OK) {
      switch (requestCode) {
      case REQUEST_CODE_COLOR:
        int color = data.getIntExtra("color", Color.WHITE);
        tvText.setTextColor(color);
        break;
      case REQUEST_CODE_ALIGN:
        int align = data.getIntExtra("alignment", Gravity.LEFT);
        tvText.setGravity(align);
        break;
      }

    } else {
      Toast.makeText(this, "Wrong result", Toast.LENGTH_SHORT).show();
    }
  }
}

Ders Sonu Notları:

requestCode – çağrısının ID’si olarak sayabiliriz. startActivityForResult’a belirleniyor ve onActivityResult’a kontrol ediyor. Amacı hangi çağırına cevap geldiğini bilmek. resultCode – çağrının statüsü. setResult metodunda oluşuyor ve onActivityResult’a kontrol ediyor. Amacı çağrının başarılı olup olmadığını belirtmek. Gelecek derslerimizde URI nedir, onu öğreneceğiz.