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"
/>
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
Yorum Gönder