Anasayfa » Android, Java ve Java Teknolojileri

Android Programlama – Menu, Toast, AlertDialog

8 Temmuz 2012 4.065 kez okundu Yorum yok
1 Star2 Stars3 Stars4 Stars5 Stars (1 oy,5 üzerinden : 5,00 )
Loading ... Loading ...

Merhaba arkadaşlar, bu yazımızda daha önceki yazımızda geliştirdiğimiz form uygulamasını biraz daha geliştireceğiz. Bu uygulamamızda menu ve toast (bilgilendirme mesajları) üzerinde duracağız. Bir önceki yazımızı okumayanlar buradan okuyabilir.  Okumak istemeyenler bir önceki uygulamayı indirip üzerinde devam edebilirler.

Diğer yazılarımız;

İlk olarak her kitaba bir kullanıcı yorumu bölümü ekleyeceğiz. Yani kitabı kaydeden kişi kendi yorumunu ya da notunu bu bölüme girecek. Daha sonra biz bir menü ekleyerek kullanıcının eklediği bu notu bir toast mesajı olarak göstereceğiz.

Yorum ekleyeceğimiz için model dosyamıza yani book.java classımıza “comment” isminde string değişken tanımlıyoruz.

private String comment="";
 
	public String getComment() {
		return comment;
	}
	public void setComment(String comment) {
		this.comment = comment;
	}

Daha sonra kullanıcın form ekranında (main.xml) yorumu girebileceği bir satır ekliyoruz.

				<TableRow>
					<TextView android:text="Yorum:" />
					<EditText android:id="@+id/comments"
					android:singleLine="false"
					android:gravity="top"
					android:lines="2"
					android:scrollHorizontally="false"
					android:maxLines="2"
					android:maxWidth="200sp"
					/>
				</TableRow>

Bu yorum alanı iki satırlık bir alandan oluşuyor. Bunun için single line özelliğini false yapıp. lines özelliğini 2 yapıyorum. Burada ayrıca ScrollView elemanı ekleyerek ekrana sığmayan formumuzu aşağı yukarı kayar hale getiriyorum.

Ardından Activity classımda sırasıyla şu değişiklikleri yapıyorum.

1) Yorum bölümüne erişebilmek için yeni bir EditText tanımlıyorum.

/**
	 * listeden seçtiğimiz elemanın detayları için bu değişkenleri localden buraya taşıdık.
	 */
	EditText name=null;
	EditText author=null;
	RadioGroup types=null;
	DatePicker date=null;
	EditText comment=null;

2) onCreate() metodu içinde view bölümünde tanımladığımız yorum alanı ile bu yeni değişkenimizi bağlıyorum

		/**
     	 * degişkenleri view elemanlarına bağlıyoruz
     	 */
        name=(EditText)findViewById(R.id.name);
        author=(EditText)findViewById(R.id.author);
        types=(RadioGroup)findViewById(R.id.types);
        date=(DatePicker)findViewById(R.id.date);
        comment=(EditText)findViewById(R.id.comment);

3) onSave() metodu içinde kayıt işlemini yapmamız gerekiyor. Yani kullanıcının girdiği yorumu book nesnemize kaydetmemiz gerekiyor.

Book  b = new Book();
			EditText name =  (EditText)findViewById(R.id.name);
			EditText author = (EditText)findViewById(R.id.author);
			DatePicker date = (DatePicker)findViewById(R.id.date);
			EditText comment = (EditText)findViewById(R.id.comment);
 
			b.setName(name.getText().toString());
			b.setAuthor(author.getText().toString());
			b.setDay(date.getDayOfMonth());
			b.setMonth(date.getMonth());
			b.setYear(date.getYear());
			b.setComment(comment.getText());

4) onListClick() metodumuzu da düzenleyerek kullanıcı listeden eleman seçerse form ekranına yorumla birlikte göndereceğiz.

			/**
			 * listeden bir eleman seçildiğinde, global değişkenlerimizi seçilen liste
			 * elemanına göre dolduruyruz
			 */
			Book b=books.get(position);
			name.setText(b.getName());
			author.setText(b.getAuthor());
			date.init(b.getYear(),b.getMonth(), b.getDay(), null);
			comment.setText(b.getComment());

Çalıştırdığımzda ise,

Bundan sonraki adımımız, opsiyon menüsü tanımlamak. Kullanıcı cihazında MENU tuşuna bastığında karşısında menümüz çıkacak ve bu menüde Yorum seçeneği olacak. Kullanıcı bu seçeneği seçerse. İlgili kitabın yorumu ekranda toast olarak görünecek.

Menüler xml dosyalarıyla yaratılırlar. Şimdi biz bu menümüzü yaratmak için res/menu/option.xml adında bir dosya yaratalım. İçini de şu şekilde dolduralım.

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/commentToast"
android:title="Yorumu Gör"
android:icon="@drawable/comment"
/>
</menu>

Burada dikkat ettiyseninz icon değeri var, Ben bunun için 32px lik bir ikon ayarlayıp res/drawable altına attım.

Menümüzün programda görünmesi için Activity classımıza şu kodu ekliyoruz.

	@Override
    public boolean onCreateOptionsMenu(Menu menu) {
	    new MenuInflater(this).inflate(R.menu.option, menu);
	    return(super.onCreateOptionsMenu(menu));
    }

Burada eğer programımızı çalıştırıp menü tuşuna basarsak menümüzün açıldığını göreceksiniz.

Şimdi gerekli kontrolleri hazırlayarak, Yorumu Gör seçeneği seçildiğinde ilgili kitabın yorumunu ekrana toast mesajı olarak basacağız. Ancak bu noktada bir sorun var. hangi kitabın yorumunu göstereceğiz.

Bu problemi çozmek için, current adında bir değişken tanımlayıp. Yeni kayıtta ve listede tıklamalarda bu değişkeni yerel book değişkenine karşı kullanacağız. Adım adım yapalım.

1)Activity classımıza current adında bir değişken tanımlayalım.

/**
	 * Yeni kaydolan veya henüz listeden seçimi yapılmış kitabımızı tutacak değişken 
	 */
	Book current = null;

2) onSave ve onListClick metodlarımızda “b” değişkeni yerine current kullanalım.

    private View.OnClickListener onSave = new View.OnClickListener() {
 
		public void onClick(View v) {
			/**
			 * local olması için buraya taşıdık.
			 */
			current = new Book();
			EditText name =  (EditText)findViewById(R.id.name);
			EditText author = (EditText)findViewById(R.id.author);
			DatePicker date = (DatePicker)findViewById(R.id.date);
			EditText comment = (EditText)findViewById(R.id.comment);
 
			current.setName(name.getText().toString());
			current.setAuthor(author.getText().toString());
			current.setDay(date.getDayOfMonth());
			current.setMonth(date.getMonth());
			current.setYear(date.getYear());
			current.setComment(comment.getText().toString());
 
			RadioGroup types=(RadioGroup)findViewById(R.id.types);//radio buttonlardan seçeneği alıyoruz
 
			/**
			 * aldığımız seçenği switch ile ilgili şekilde kaydediyoruz.
			 */
			switch (types.getCheckedRadioButtonId()) {
			case R.id.adventure:
				current.setType("adventure");
				break;
			case R.id.biography:
				current.setType("biography");
				break;
			case R.id.documentary:
				current.setType("documentary");
				break;
			}
 
			/**
			 * adaptöre yeni elemanı ekliyoruz.
			 */
			adapter.add(current);
		}
 
	};
	private AdapterView.OnItemClickListener onListClick=new	AdapterView.OnItemClickListener() {
		public void onItemClick(AdapterView<?> parent,View view, int position,long id) {
 
			/**
			 * listeden bir eleman seçildiğinde, global değişkenlerimizi seçilen liste
			 * elemanına göre dolduruyruz
			 */
			current=books.get(position);
			name.setText(current.getName());
			author.setText(current.getAuthor());
			date.init(current.getYear(),current.getMonth(), current.getDay(), null);
			comment.setText(current.getComment());
 
			if (current.getType().equals("adventure")) {
			types.check(R.id.adventure);
			}
			else if (current.getType().equals("biography")) {
			types.check(R.id.biography);
			}
			else {
			types.check(R.id.documentary);
			}
			getTabHost().setCurrentTab(1);
		}
	};

Şimdide menü tuşuna basıldığında yapılacak işlemleri kodlayalım. Bunun için onOptionsItemSelected isminde bir metod kullanıyoruz. Bu metodu activity classımıza ekleyelim. Burada ilk başta mesajımızı current null ise “Kitap seçilmedi” şeklinde yaratıyoruz. Daha sonra current null değilse ilgili yorumu alıyoruz. Ve toast  mesajına bu yorumu vererek ekranda görünmesini sağlıyoruz.

   /**
     * Menüden seçim yapıldığında kullanıyoruz
     */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
	    if (item.getItemId()==R.id.commentToast) {
	    	String message="Kitap Seçilmedi";
	    	if (current!=null) {
	    		message=current.getComment();
	    }
	    	/**
	    	 * ekranda bilgi mesajı gösteren yapı.
	    	 * İlk eleman bulunduğu activity
	    	 * ikinci eleman gösterilecek mesaj
	    	 * üçüncü eleman ise gösterilecek süre (short yada long)
	    	 */
	    Toast.makeText(this, message, Toast.LENGTH_LONG).show();
	    return(true);
	    }
	    return(super.onOptionsItemSelected(item));
    }

Peki biz toast mesajı değilde alertDialog mesajı göstermek istersek ne yapmamız gerekiyor? O zaman toast mesajı yerine şunu yazmamız gerekiyor.

			/**
	    	 * Toast Mesajı yerine kullanacağız.
	    	 */
	    	AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
	    	//başlığı
	    	alertDialogBuilder.setTitle("Kitaba Yapılan Yorum");
	    	//mesajı
	    	alertDialogBuilder.setMessage(message);
	    	//ekranın cancel edilememesi
	    	alertDialogBuilder.setCancelable(false);
	    	//kullanıcıya sunulan seçenek
	    	alertDialogBuilder.setNeutralButton("Tamam",new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog,int id) {
					// if this button is clicked, just close
					// the dialog box and do nothing
					dialog.cancel();
				}
			});
	    	//set ettiğimiz bu bilgilerden bir dialog yaratıp gösteriyoruz
	    	AlertDialog alertDialog = alertDialogBuilder.create();
	    	//gosteriyoruz
	    	alertDialog.show();

Son olarakta şöyle bir uygulama yapalım. Menümüzde sadece yorum okuma seçeneği olmasın da, aynı zamanda bulunduğumuz tab’ı değiştiren bir seçenek olsun. Örneğin kitap listesindeyken MENU tuşuna bastığımızda detay yani form sayfasını açabileceğimiz bir buton olacak. Detay sayfasında iken de liste sayfamızı açabileceğimiz bir buton olacak. Bu menünün ikinci seçeneği ya detay ya liste olacak ve bu yapı bulunduğumuz sayfaya göre dinamik değişecek. Öncelikle ekran görüntülerine bakarak nasıl bir şeyden bahsettiğimizi anlayalım.

Bunun için yapmamız gerekenler şunlar;

İlk olarak option.xml dosyasına ikinci bir item ekliyoruz

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/commentToast"
android:title="Yorumu Gör"
android:icon="@drawable/comment"
/>
<item android:id="@+id/otherOption"
android:title="Detay"
android:icon="@drawable/detail"
/>
</menu>

Daha sonra Activity classımızda menümüzü tutabileceğimiz yeni bir değişken tanımlıyoruz.

Menu menu=null;

onCreateOptionsMenu() metodu içinde gelen menüyü bu tanımladığımız değişkene eşitliyoruz.

this.menu=menu;

Bundan sonrası onOptionsItemSelected() metodu içinde, if else yapısı içinde hangi butona basıldığını buluyoruz. Eğer bizim seçeneğimiz seçilmiş ise

else  if (item.getItemId()==R.id.otherOption){}

Hangi tab’da bulunduğumuzu öğrenerek diğer tab’a geçiş yapıyoruz. Bu arada menümüzün başlığını  ve ikonunu tekrar güncelliyoruz.

		else  if (item.getItemId()==R.id.otherOption){
	    	if(getTabHost().getCurrentTab()==0)
	    	{
	    		MenuItem m = menu.findItem(R.id.otherOption);
	    		m.setTitle("Liste");
	    		m.setIcon(R.drawable.books);
	    		getTabHost().setCurrentTab(1);
	    	}
	    	else
	    	{
	    		MenuItem m = menu.findItem(R.id.otherOption);
	    		m.setTitle("Detay");
	    		m.setIcon(R.drawable.detail);
	    		getTabHost().setCurrentTab(0);
	    	}
		}

 
Activity classımızın son hali ise;

package kodmerkezi.net.basitForm;
 
import java.util.ArrayList;
import java.util.List;
 
import kodmerkezi.net.basitForm.R.menu;
 
import android.app.Activity;
import android.app.AlertDialog;
import android.app.TabActivity;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RadioGroup;
import android.widget.Spinner;
import android.widget.TabHost;
import android.widget.TextView;
import android.widget.Toast;
 
public class BasitFormActivity extends TabActivity {
 
	/**
	 * Kitapları Liste halinde tutacağımız için ArrayList cinsinde tanımlıyoruz
	 */
	List<Book> books = new ArrayList<Book>();
 
	/**
	 * ListView ile bağlantıyı kuracak adaptörümüz
	 */
	ArrayAdapter<Book> adapter=null;
 
	/**
	 * listeden seçtiğimiz elemanın detayları için bu değişkenleri localden buraya taşıdık.
	 */
	EditText name=null;
	EditText author=null;
	RadioGroup types=null;
	DatePicker date=null;
	EditText comment=null;
	Menu menu=null;
 
	/**
	 * Yeni kaydolan veya henüz listeden seçimi yapılmış kitabımızı tutacak değişken 
	 */
	Book current = null;
 
	/**
	 * AutoComplete özelliği için yazarlarımız
	 */
	 private static final String[] AUTHORS = new String[] {
         "Gurcan Kavakçı", "Mehmet S.", "Ali T.", "Hasan G.", "Saffet C."
     };
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
     	/**
     	 * degişkenleri view elemanlarına bağlıyoruz
     	 */
        name=(EditText)findViewById(R.id.name);
        author=(EditText)findViewById(R.id.author);
        types=(RadioGroup)findViewById(R.id.types);
        date=(DatePicker)findViewById(R.id.date);
        comment=(EditText)findViewById(R.id.comment);
 
        Button save = (Button)findViewById(R.id.save);
        save.setOnClickListener(onSave);
 
 
        ListView list=(ListView)findViewById(R.id.books);
 
        /**
         * adaptörümüzü yaratıyoruz.
         */
        adapter = new BookAdapter();
 
        /**
         * ListView ile adaptör bağlantısını sağlıyoruz
         */
        list.setAdapter(adapter);
 
        /**
         * Yazar için AutoComplete özelliği
         */
        ArrayAdapter<String> adapter_author = new ArrayAdapter<String>(this,
                android.R.layout.simple_dropdown_item_1line, AUTHORS);
        AutoCompleteTextView textView = (AutoCompleteTextView)findViewById(R.id.author);
        textView.setAdapter(adapter_author);
 
        /**
         * 1. tab için
         */
        TabHost.TabSpec spec=getTabHost().newTabSpec("tag1");
        spec.setContent(R.id.books);
        spec.setIndicator("List", getResources().getDrawable(R.drawable.books));
        getTabHost().addTab(spec);
        /**
         * 2. tab için
         */
        spec=getTabHost().newTabSpec("tag2");
        spec.setContent(R.id.details);
        spec.setIndicator("Details", getResources()
        .getDrawable(R.drawable.detail));
        getTabHost().addTab(spec);
 
        getTabHost().setCurrentTab(0);
        /**
         * listemizin listener ile bağlantısını kuruyoruz
         */
        list.setOnItemClickListener(onListClick);
    }
    /**
     * Menümüzü yaratıyoruz
     */
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    	this.menu=menu;
	    new MenuInflater(this).inflate(R.menu.option, menu);
	    return(super.onCreateOptionsMenu(menu));
    }
    /**
     * Menüden seçim yapıldığında kullanıyoruz
     */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    	/**
    	 * Eğer yorum seçeneği seçilmişse
    	 */
	    if (item.getItemId()==R.id.commentToast) {
	    	String message="Kitap Seçilmedi";
	    	if (current!=null) {
	    		message=current.getComment();
	    }
	    	/**
	    	 * ekranda bilgi mesajı gösteren yapı.
	    	 * İlk eleman bulunduğu activity
	    	 * ikinci eleman gösterilecek mesaj
	    	 * üçüncü eleman ise gösterilecek süre (short yada long)
	    	 */
	    	//Toast.makeText(this, message, Toast.LENGTH_LONG).show();
 
	    	/**
	    	 * Toast Mesajı yerine kullanacağız.
	    	 */
	    	AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
	    	//başlığı
	    	alertDialogBuilder.setTitle("Kitaba Yapılan Yorum");
	    	//mesajı
	    	alertDialogBuilder.setMessage(message);
	    	//ekranın cancel edilememesi
	    	alertDialogBuilder.setCancelable(false);
	    	//kullanıcıya sunulan seçenek
	    	alertDialogBuilder.setNeutralButton("Tamam",new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog,int id) {
					// if this button is clicked, just close
					// the dialog box and do nothing
					dialog.cancel();
				}
			});
	    	//set ettiğimiz bu bilgilerden bir dialog yaratıp gösteriyoruz
	    	AlertDialog alertDialog = alertDialogBuilder.create();
	    	//gosteriyoruz
	    	alertDialog.show();
	    return(true);
	    }
	    /**
	     * Detay sayfası seçilmiş ise
	     */
	    else  if (item.getItemId()==R.id.otherOption){
	    	if(getTabHost().getCurrentTab()==0)
	    	{
	    		MenuItem m = menu.findItem(R.id.otherOption);
	    		m.setTitle("Liste");
	    		m.setIcon(R.drawable.books);
	    		getTabHost().setCurrentTab(1);
	    	}
	    	else
	    	{
	    		MenuItem m = menu.findItem(R.id.otherOption);
	    		m.setTitle("Detay");
	    		m.setIcon(R.drawable.detail);
	    		getTabHost().setCurrentTab(0);
	    	}
		}
	    return(super.onOptionsItemSelected(item));
    }
    /**
     * Formumuzda yeni kitap kaydında çalışıyor
     */
    private View.OnClickListener onSave = new View.OnClickListener() {
 
		public void onClick(View v) {
			/**
			 * local olması için buraya taşıdık.
			 */
			current = new Book();
			EditText name =  (EditText)findViewById(R.id.name);
			EditText author = (EditText)findViewById(R.id.author);
			DatePicker date = (DatePicker)findViewById(R.id.date);
			EditText comment = (EditText)findViewById(R.id.comment);
 
			current.setName(name.getText().toString());
			current.setAuthor(author.getText().toString());
			current.setDay(date.getDayOfMonth());
			current.setMonth(date.getMonth());
			current.setYear(date.getYear());
			current.setComment(comment.getText().toString());
 
			RadioGroup types=(RadioGroup)findViewById(R.id.types);//radio buttonlardan seçeneği alıyoruz
 
			/**
			 * aldığımız seçenği switch ile ilgili şekilde kaydediyoruz.
			 */
			switch (types.getCheckedRadioButtonId()) {
			case R.id.adventure:
				current.setType("adventure");
				break;
			case R.id.biography:
				current.setType("biography");
				break;
			case R.id.documentary:
				current.setType("documentary");
				break;
			}
 
			/**
			 * adaptöre yeni elemanı ekliyoruz.
			 */
			adapter.add(current);
		}
 
	};
	/**
	 * Listeden bir eleman seçilirse çalışıyor
	 */
	private AdapterView.OnItemClickListener onListClick=new	AdapterView.OnItemClickListener() {
		public void onItemClick(AdapterView<?> parent,View view, int position,long id) {
 
			/**
			 * listeden bir eleman seçildiğinde, global değişkenlerimizi seçilen liste
			 * elemanına göre dolduruyruz
			 */
			current=books.get(position);
			name.setText(current.getName());
			author.setText(current.getAuthor());
			date.init(current.getYear(),current.getMonth(), current.getDay(), null);
			comment.setText(current.getComment());
 
			if (current.getType().equals("adventure")) {
			types.check(R.id.adventure);
			}
			else if (current.getType().equals("biography")) {
			types.check(R.id.biography);
			}
			else {
			types.check(R.id.documentary);
			}
			getTabHost().setCurrentTab(1);
		}
	};
	/**
	 * Kitaplarımızı liste halinde listViewda görünmesini sağlayan adapter
	 */
	public class BookAdapter extends ArrayAdapter<Book> {
 
		public BookAdapter() {
			super(BasitFormActivity.this,android.R.layout.simple_list_item_1,books);
		}
		public View getView(int position, View convertView,	ViewGroup parent) {
 
				View row=convertView;
				BookHolder holder = null;
 
				if (row==null) {
					LayoutInflater inflater=getLayoutInflater();
					row=inflater.inflate(R.layout.satir,parent,false);
					holder=new BookHolder(row);
					row.setTag(holder);
				}
				else
				{
					holder=(BookHolder)row.getTag();
				}
 
				holder.populateFrom(books.get(position));
				return row;
			}
 
	}
	/**
	 * Kitaplarımızı tutan yapı
	 */
	static class BookHolder {
		private TextView name=null;
		private TextView author=null;
		private ImageView icon=null;
		private View row=null;
 
		BookHolder(View row) {
			this.row=row;
			name=(TextView)row.findViewById(R.id.name);
			author=(TextView)row.findViewById(R.id.author);
			icon=(ImageView)row.findViewById(R.id.icon);
		}
		void populateFrom(Book b) {
			name.setText(b.getName());
			author.setText(b.getAuthor());
			if (b.getType().equals("adventure")) {
				icon.setImageResource(R.drawable.blue);
			}
			else if (b.getType().equals("biography")) {
				icon.setImageResource(R.drawable.red);
			}
			else {
				icon.setImageResource(R.drawable.yellow);
			}
		}
	}
}

Şimdi geriye dönüp baktığımızda, öncelikle menü oluşturduk. Bu menüden yararlanarak toast mesajları çıkardık. Sonra bu mesajlar yerine alertDialog lar kullandık. Ve en son dinamik olarak menümüzdeki seçenekleri değiştirdik. Sonraki yazılarımızda projemizi geliştirmeye devam edeceğiz, takip etmeye devam edin.

Projenin kaynak kodlarını buradan indirebilirsiniz. Rar şifresi: www.kodmerkezi.net

<<< Önceki:

Sonraki: >>>


Facebookta Paylaş

Yorum Bırakın!

Yorum yaz, yada kendi sitende trackback (Geri besleme) olarak ekle. Ayrıca RSS ile bu konuya üye olabilirsin. .

Nazik olun. Temiz tutun. Konu dışına çıkmayın. Spam yaratmayın.

Bu tagları kullanabilirsiniz:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Bloğumuz gavatarı desteklemektedir. Kendi gavatarınızı edinmek için lütfen Gravatar a üye olun.