Ana içeriğe atla

19. Android’e To-Do List Menü Örneği

1. ToDoList aktivite sınıfında Menü işlevi için ihtiyacınız olan paketleri içe aktararak başlayın.

import android.view.Menu;
import android.view.MenuItem;
import android.view.ContextMenu;
import android.widget.AdapterView;

2. Erişim belirteci private static final olan değişkenler ekleyerek her menü nesnesi için eşsiz ID’ler tanımlayın.

static final private int ADD_NEW_TODO = Menu.FIRST;
static final private int REMOVE_TODO = Menu.FIRST + 1;

3. 2 yeni menü nesnesi eklemek için onCreateOptionsMenu metodunu ezin Nesnelerden biri eklemek diğeri çıkarmak için olacak. Uygun yazıyı yazın ve ikon kaynağını atayarak her nesne için kısa yol tuşu belirleyin.

@Override
  public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);     
    MenuItem itemAdd = menu.add(0, ADD_NEW_TODO, Menu.NONE, R.string.add_new);
    MenuItem itemRem = menu.add(0, REMOVE_TODO, Menu.NONE, R.string.remove);
    itemAdd.setIcon(R.drawable.add_new_item);
    itemRem.setIcon(R.drawable.remove_item);
    itemAdd.setShortcut('0', 'a');
    itemRem.setShortcut('1', 'r');
    return true;
  }

4. Aktivite menüsünü oluşturduktan sonra bağlam menüsünü oluşturun. List View’u bağlam menüsünde kullanabilmek için onCreate’i değiştirin. Daha sonra remove nesnesiyle oluşturmak için onCreateContextMenu metodunu ezin.

@Override
  public void onCreate(Bundle icicle) {
    registerForContextMenu(myListView);
  }
  @Override
   public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {    
     super.onCreateContextMenu(menu, v, menuInfo);
    menu.setHeaderTitle("Selected To Do Item");
     menu.add(0, REMOVE_TODO, Menu.NONE, R.string.remove);           
   }

5. Uygulama bağlamına göre menünün görünümünü değiştirin OnPrepareOptionsMenu metodunu ezin.

private boolean addingNew = false;
  @Override
  public boolean onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);
    int idx = myListView.getSelectedItemPosition();
    String removeTitle = getString(addingNew ? R.string.cancel : R.string.remove);
    MenuItem removeItem = menu.findItem(REMOVE_TODO);
    removeItem.setTitle(removeTitle);
    removeItem.setVisible(addingNew || idx > -1);
    return true;   
  }

6. 5. Adımdaki kodun çalışması için ListView kontrolünün kapsamını arttırmalısınız. Aynı şeyi ArrayAdapter ve EditText için de yaparak add ve remove işlevlerini desteklemelerini sağlayın.

private ArrayList<String> todoItems;
  private ListView myListView;
  private EditText myEditText;
  private ArrayAdapter<String> aa;
  @Override
  public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.main);
    myListView = (ListView)findViewById(R.id.myListView);
    myEditText = (EditText)findViewById(R.id.myEditText);
    todoItems = new ArrayList<String>();
    aa = new ArrayAdapter<String>(getApplicationContext(), R.layout.todolist_item, todoItems);
    myListView.setAdapter(aa);
    myEditText.setOnKeyListener(new OnKeyListener() {
      public boolean onKey(View v, int keyCode, KeyEvent event) {
        if (event.getAction() == KeyEvent.ACTION_DOWN)
          if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
            todoItems.add(0, myEditText.getText().toString());
            myEditText.setText("");
            aa.notifyDataSetChanged();
            cancelAdd();
            return true;
          }
        return false;
      }
    });
    registerForContextMenu(myListView);
  }

7. OnOptionItemSelected metodunu ezerek başlayın. “remove” menü nesnesi için getSelectedItemPosition metodounu kullanarak seçili nesneyi bulabilirsiniz.

@Override
  public boolean onOptionsItemSelected(MenuItem item) {
    super.onOptionsItemSelected(item);
    int index = myListView.getSelectedItemPosition();
    switch (item.getItemId()) {
      case (REMOVE_TODO): {
        if (addingNew) {
          cancelAdd();
        }
        else {
          removeItem(index);
        }
        return true;
      }
      case (ADD_NEW_TODO): {
        addNewItem();
        return true;
      }
    }
    return false;
  }

8. Bağlam menüsü nesnelerinin seçimini yönetmek için onContextItemSelected metodunu ezin. ContextMenuInfo’nun AdapterView-spesifik uygulamasını kullanıyorsunuz. Bu bağlam menüsünün tetiklendiği view’a ve görüntülediği verinin indeksine referans ekler. Onu kaldırılacak nesnenin indeksi olarak kullanın.

@Override
  public boolean onContextItemSelected(MenuItem item) { 
    super.onContextItemSelected(item);
    switch (item.getItemId()) {
      case (REMOVE_TODO): {
        AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo)item.getMenuInfo();                
        int index = menuInfo.position;
        removeItem(index);
        return true;
      }
    }
    return false;
  }

9. Menü nesnesi seçim işleyicilerini çağırmak için kökler yaratın. Yeni işlevler için her kökü uygulayın.

private void cancelAdd() {
     addingNew = false;
     myEditText.setVisibility(View.GONE);
  }
  private void addNewItem() {
     addingNew = true;   
     myEditText.setVisibility(View.VISIBLE);
     myEditText.requestFocus();
  }
  private void removeItem(int _index) {
    todoItems.remove(_index);
    aa.notifyDataSetChanged(); 
  }

10. Listeye yeni bir nesne ekledikten sonra yazı giriş kutusunu saklamanız gerekir. OnCreate metodu içinde onKeyListener’ın cancelAdd fonksiyonunu çağıracağı şekilde modifiye edin.

myEditText.setOnKeyListener(new OnKeyListener() {
      public boolean onKey(View v, int keyCode, KeyEvent event) {
        if (event.getAction() == KeyEvent.ACTION_DOWN)
          if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
            todoItems.add(0, myEditText.getText().toString());
            myEditText.setText("");
            aa.notifyDataSetChanged();
            cancelAdd();
            return true;
          }
        return false;
      }
    });

11. Kullanıcı arayüzü tutarlılığını sağlamak için main.xml kaynağını kullanıcı yeni bir nesne eklemeyi seçene kadar yazı girdi kutusunu saklayacak şekilde düzenleyin.

<EditText
    android:id="@+id/myEditText"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text=""
    android:visibility="gone"
  />

Yorumlar

Bu blogdaki popüler yayınlar

Basit ve Dinamik Disk Nedir? Birbirine Nasıl Dönüştürülür?

Sabit diskler Windows 2000 işletim sistemine kadar sadece temel disk (basic disk) olarak ayarlanabiliyordu. Temel disk en fazla 4 birincil bölüm (primary partition) veya 3 primary ve 1 genişleyebilir bölüm (extended partition) şeklinde yapılandırılabilir. Bir temel diskte sadece 1 tane extended partition oluşturulabilir ve sadece primary partitionlara işletim sistemi kurulabilir. Windows 2000 ile gelen dinamik disk teknolojisi, Windows 2000 den sonraki tüm Windowssürümlerinde kullanılabilmektedir. Dinamik disk kavramıyla bölüm (partition) kavramı yerinihacim (volume) kavramına bırakmıştır. Dinamik disklerde, temel disklerde olduğu gibi bir sınırlama yoktur. İstenildiği kadar volume oluşturabilir, temel disk istenirse dinamik hale getirebilir ve bu işlem esnasında herhangi bir veri kaybı yaşanmaz. Fakat dinamik diskler temel diske çevirildiğinde bir veri kaybı söz konusu olacaktır. Temel diskin bilgileri kayıt defterinde tutulur. Dinamik diskin bilgileri kendi üstünde tutulur.

Einstein'in Rölativite Kuramına Bakış

Bu yüzyılın başlarında kuramsal fizikte altın çağ başladığı zaman, adı henüz bilim dünyasında duyulmamış bir fizikçi vardı. Bu, Annalen der Physık’in 1905 tarihli sayısında fotoelektrik olayı, Brown hareketi ve özel görelilikle ilgili ünlü üç çalışmasını birden yayınlayarak üne kavuşan Albert Einstein’dır. Onun fizikteki hayat boyu çalışmaları bilimin felsefesi ve yöntemleri üzerinde büyük etki yaptı. Einstein’ın kendisi bilimci filozoftu. Bu yüzyılın başlarında kuramsal fizikte altın çağ başladığı zaman, adı henüz bilim dünyasında duyulmamış bir fizikçi vardı. Bu, Annalen der Physık’in 1905 tarihli sayısında fotoelektrik olayı, Brown hareketi ve özel görelilikle ilgili ünlü üç çalışmasını birden yayınlayarak üne kavuşan Albert Einstein’dır. Onun fizikteki hayat boyu çalışmaları bilimin felsefesi ve yöntemleri üzerinde büyük etki yaptı. Einstein’ın kendisi bilimci filozoftu. O, hayranlık uyandırıcı bir şekilde felsefeyi kullanarak bugün modern bilimin önemli bir kısmı olan buluşlarını

Rubik Küp Nasıl Çözülür?

Rubik küp 3x3x3 veya 4x4x4 gibi karesel formatta ve her kenarı farklı renkte olan bir küptür. Bu küpün; sabır küpü, sinir küpü, zekâ küpü, renk küpü, Rubikin küpü, sihirli küp (magic box), 3d Puzzle, gibi birçok değişik adı vardır. Unutulmamalıdır ki küpün çözümü için geliştirilmiş bir algoritma vardır. Bu küp ezbere çözülemez. Bu yazıda sizlere küpün en yaygın çözümü anlatılacaktır. Hata yaptığınız yerde hatayı düzeltmeye çalışmayın belirtilen algoritma çerçevesinde çözüme baştan başlayın. Hala küpü çözemediyseniz buradaki yazımızda belirtilen otomatik çözen programları deneyebilirsiniz. Öncelikle bilmeniz gerekenler: Küpün parçaları birbirinden bağımsız değildirler. Küpün orta noktası daima sabittir. Küpü ne kadar çevirirseniz çevirin değişmezler. Kırmızının karşısında daima turuncu, yeşilin karşısında mavi, sarının karşısında beyaz vardır. Bir küp, toplam 26 adet parçadan oluşmaktadır: 8 adet üç renkli köşe parçası, 12 adet iki renkli parça ve 6 adet de sabit tek ren