AutoCompleteTextView
AutoCompleteTextView
kontrolü bir edit alanını bir diziden hareketle oraya yazılan bilgiyi otomatik tamamlayan bir kontroldür.
AutoCompleteTextView
kontrolü ArrayAdapter sınıfı ile çalışan bir kontroldür. AutoCompleteTextView
sınıfının setAdapter
isimli metodu yardımıyla adapter sınıf buraya verilebilir.
AutoCompleteTextView
sınıfı EditText
sınıfından türetilmiştir.
AutoCompleteTextView
aşağıdaki gibi kullanılabilir:
m_autoCompleteTextViewCities =(AutoCompleteTextView)this.findViewById(R.id.MAINACTIVITY_AUTOCOMPLETETEXTVIEW_CITIES);
m_cities = new ArrayList<>();
m_cities.add("Ankara");
m_cities.add("Adana");
m_cities.add("Adıyaman");
m_cities.add("İstanbul");
m_cities.add("İskenderun");
m_cities.add("Zonguldak");
m_cities.add("Bursa");
m_cities.add("Burdur");
m_cities.add("Bitlis");
m_citiesAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, m_cities);
m_autoCompleteTextViewCities.setAdapter(m_citiesAdapter);
Dinamik olarak Adapter'a ekleme yapılırsa bu durumda AutoCompleteTextView
'in bundan haberi olması için notifyDataSetChanged
çağrılmalıdır. Bu aşamadan sonra artık yeni datadan AutoCompleteTextView
'in haberi olacaktır.
Anahtar Notlar : String sınıfının split
metodu birden fazla ayraç durumunda düzenli ifade kabul etmektedir. Buna göre birden fazla ayraç için düzenli ifade için şöyle olabilir: "[ \t:,;]+"
Buradaki + iki ayraç arasında boş String varsa onu döndürülen diziye dahil etme anlamındadır.
[DROPBOX]059-AutoCompleteTextView
MultiAutoCompleteTextView Sınıfı ve Kontrolü
MultiAutoCompleteTextView
sınıfı MultiCompleteTextView
sınıfından türetilmiştir. Bu kontrolünün diğerinden tek farkı belirli ayraçtan sonraki yazılarıda tamamlayabilme özelliğidir. MultiAutoCompleteTextView
sınıfının setTokenizer
metoduyla ayraç belirlenebilmektedir.
MultiAutoCompleteTextView
sınıfı içerisinde Tokenizer
isimli bir sınıf bulunmaktadır. Bu sınıfta CommaTokenizer
isimli bir arayüz bulunmaktadır.
Tokenizer
arayüzünün üç adet metodu bulunur:
findTokenEnd(CharSequence text, int cursor)
findTokenStart(CharSequence text, int cursor)
terminateToken(CharSequence text)
[DROPBOX]060-MultiAutoCompleteTextView
EditText ve ondan Türetilen Sınıflarda Basılan Noktada Yazının Elde Edilmesi
EditText içerisinde yazı değiştikçe o yazının elde edilmesi birçok senaryoda kullanılması gereken durumdur. Bunun için addTextChangedListener
metodu kullanılabilir. Bu metot TextWatcher
isimli bir arayüzü implemente eden bir nesne beklemektedir. Bu arayüzün metotları şunlardır:
afterTextChanged
beforeTextChanged
onTextChanged
afterTextChanged
metotu herhangi bir yazı değiştirildikten sonra çağrılan metottur.
beforeTextChanged
metotu yazı değiştirilmeden önceki durum için çağrılan metottur.
onTextChanged
metotu ise yazının değişme noktasında çağrılan metottur.
Buna göre programcının bu arayüzü implemente ettikten sonra bu metotları yazması gerekir. Bu metotların hepsi o anki yazıyı CharSequence isimli bir arayüz referansı ile verebilmektedir.beforeTextChanged
metotu özellikle bir önceki yazıyı verir.
AutoCompleteTextView
ya da MultiAutoCompleteTextView
sınıfı için hangi elemanın seçili olduğu setOnItemClickListener
metotu ile dinlenip takip edilebilir. Bu durum birebir ListView ile aynıdır.
[DROPBOX]061-TextWatchingEditText
TextWatcher Arayüzü
TextWatcher arayüzü herhangi bir textin izlenmesi için kullanılmaktadır.Bu arayüzün üç tane abstract metodu vardır.
beforeTextChanged
afterTextChanged
onTextChanged
Örneğin bir editext kontrol elemanı kendi içerisinde bir Listener ile özelleştirilebilir. Bu işlem için editText kontrolünün addTextChangeListener metodu kullanılır.
TextWatcher sınıfı android.text sınıfında bildirilmiştir.
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after){}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count){}
@Override
public void afterTextChanged(Editable s){}
beforeTextChanged metodunun 1. parametresi o anki bulunan yazının start parametresinden itibaren count kadar aralığının after uzunlukta bir yazı ile değiştirileceğini bildirmektedir.
TextWatchers Sınıfı Kullanarak Belirli Bir EditText'in Yazılması
[Dropbox]079-TextWatcherSample
EditText kontrolü kendi içerisinde değişşiklikleri algılayabilir.Fakat daha spesifik durumlar için Edittexxtten türetilmiş ve TextWatcher arayüzünü implemente etmiş bir sınıf yazılabilir.Bu sınıf için beforeTextChanged
içerisinde bir önceki yazı alınacak ve afterTextChanged
içerisinde ise değişiklik yapılabilecektir.Şüphesiz değişiklik işlemi onTextChanged içerisinde de yapılabiliir fakat burada döngüsel bir duruma girmemek için programcının textin değişiip değişmediğini kontrol etmesi gereklidir.Yoksa sürekli olarak değişiklik algılanacak ve döngüsel durum oluşacaktır.
Sadece rakam karakterlerinin basilabildigi bir editText konrolu asagidaki gibi yapilabilir.
public class MyEditText extends EditText implements TextWatcher{
private String m_curText = "";
public MyEditText(Context context)
{
super(context);
this.addTextChangedListener(this);
}
@Override
public void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter)
{
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after)
{
m_curText = s.toString();
}
@Override
public void afterTextChanged(Editable s)
{
if (!m_curText.equals(s.toString())) {
char ch = s.toString().charAt(s.toString().length() - 1);
if (ch < '0' || ch > '9')
this.setText(m_curText);
else
this.setText(s.toString());
this.setSelection(m_curText.length());
}
}
}
Burada dikkat edilmesi gereken onTextChanged
içerisnde değişiklik henüz yansımadığından setText yapmanın bir etkisi olmamasıdır.