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.

  1. beforeTextChanged
  2. afterTextChanged
  3. 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.