View sınıfı android.view içerisindedir.

View : Her bir görsel elemana view denir . buton , checkbox ,editText gibi.

View group: görünür view elemanlarının grup halinde olanı denilebilir. RadioButton Group gibi.

Projelerde tercih ettiğimiz İsimlendirme

Button

  • Button sınıfı android.widget isimli sınıftan türetilmiştir.
  • C# daki gibi event yapısı yok.
  • Butona basılma durumunu ele alma 3 şekilde yapılabilir.

    • Listener sınıflarla yapılır. Android 1.5'den sonra C# daki yapıya benzer bir yapı getirildi.Butona ait Property'den onClick metodu tanımlanarak yapılabilir.

    • View.OnClickListener interface'ini destekleyen bir sınıf yazarak

    • MainActivity'ye View.OnClickListiner interface'i implemente edilerek

Butonun xml yapısı

 <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Button"
        android:id="@+id/button"
        android:layout_gravity="center_horizontal"
 />

android:layout_width

  • fill parrent : deprecated
  • match parrent : layoutun boyutu kadar yap
  • wrap content : içerik kadar boyut oluştur.
  • inch, pixel, dpi da verilebilir.

android:id

  • android:id="@+id/MAINCACTIVITY_BUTTON_SEND" Elemana ait idnin verilmesi burada yapılır.İsimlendirme yaparken Activity adı , View elemanının cinsi gibi bilgiler ve elemanın görevi girilirse projede kolaylık sağlar. Stringin başlangıcındaki "@+id/" ise R sınıfının içinde verilen isimde veri elemanı generate et anlamına gelmektedir.

  • Verilen isimlendirme R sınıfı altında public static final int olarak sayısal bir değerin adı olarak tanımlanır.

  • Erişmek için R.id.MAINACTIVTY_BUTTON_SEND ile ulaşılabilir.


1. onClick Metoduyla Butonun Kullanımı

Bu yöntem tüm View elemanlarında geçerli değildir.

  • property'den onClick metodu eklenerek ya da
  • content_main.xml içersine ilgili butona android:onClick="<BUTONAAITMETOD>" eklenir.
  • MainActiviy içerisine metod , public void <BUTONAAITMETOD>(View v) olacak şekilde yazılır.

content_main.xml

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="BUTTON1"
        android:id="@+id/button"
        android:layout_gravity="center_horizontal"
        android:onClick="okButtonClick"
        />

MainActivity.java

package csd.samples.gui;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;


public class MainActivity extends AppCompatActivity
{
    protected  void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public  void  okButtonClick(View w)
    {
        Toast.makeText(this , "Basildi" , Toast.LENGTH_SHORT).show();
    }
}

Tek metodla birden fazla buton Handle etmek için

content_main.xml

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="OK"
        android:id="@+id/MAINACTIVITY_BUTTON_OK"
        android:onClick="ButtonClick"
        />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="CLOSE"
        android:id="@+id/MAINACTIVITY_BUTTON_CLOSE"
        android:onClick="ButtonClick"
        />

MainActivity

    public void ButtonClick(View v)
    {
        switch(v.getId())
        {
            case R.id.MAINACTIVITY_BUTTON_OK:
                Toast.makeText(this , "Ok butonuna basildi" , Toast.LENGTH_SHORT).show();
                break;

            case R.id.MAINACTIVITY_BUTTON_CLOSE:
                Toast.makeText(this , "Close butonuna basildi" , Toast.LENGTH_SHORT).show();
                break;
        }
    }

2. View.OnClickListener Interface'ini destekleyen bir sınıf yazarak

  • Button m_buttonStartStop yaratılır.
  • onCreate metodunda m_buttonStartStop'un ilk değer ataması findViewById(R.id.<BUTONID>)'nin döndürdüğü değerin (View) Buttona cast edilmesi ile yapılır.

  • Bu butonun setOnClickListener metoduna OnClickListinerInterface'ini destekleyen bir sınıf geçilir.

content_main.xml

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Start"
        android:id="@+id/MAINACTIVITY_BUTTON_STARTSTOP"
        android:layout_gravity="center_horizontal"/>

OnClickListiner'ın anonim yaratılmış hali

MainActivity.java

package csd.samples.gui;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity
{
    private Button m_buttonStartStop;

    private void init()
    {
        m_buttonStartStop = (Button)this.findViewById(R.id.MAINACTIVITY_BUTTON_STARTSTOP);

        View.OnClickListener listener = new View.OnClickListener() 
        {
            @Override
            public void onClick(View v)
            {
                m_buttonStartStop.setText(m_buttonStartStop.getText().toString().compareTo("Start") == 0 ? "Stop" : "Start");
            }
        };

        m_buttonStartStop.setOnClickListener(listener); 
    }

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        this.init();
    }
}

OnClickListiner'ın ayrı bir classda implemente edilmiş hali

MainActivity.java

 private void init()
    {
        m_buttonStartStop = (Button)this.findViewById(R.id.R_id_MAINACTIVITY_BUTTON_STARTSTOP);
        m_buttonStartStop.setOnClickListener(new StartStopButtonListener());
    }


    class StartStopButtonListener implements View.OnClickListener
    {
        @Override
        public void onClick(View view)
        {
            m_buttonStartStop.setText(m_buttonStartStop.getText().toString().compareTo("Start") == 0 ? "Stop" : "Start");
        }
    }

3. MainActivity'ye View.OnClickListiner Interface'i implemente edilerek

  • 2.yöntemden farkı , yeni bir sınıf yazıp onun OnClickListiner'i desteklemesini sağlamak yerine direk MainActivity'i OnClickListiner'i destekler hale getirmek
  • MainActivity'ye OnclickListener'i implemente ediyoruz.
  • onClick metodunu override ediyoruz.
  • Butonun setOnClickListener metoduna OnClickListinerInterface'ini destekleyen (kendisini) this ile geçiyoruz.

content_main.xml

 <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="On"
        android:id="@+id/MAINACTIVITY_BUTTON_ONOFF"/>

MainActivity.java

package csd.samples.gui;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;


public class MainActivity extends AppCompatActivity implements View.OnClickListener
{
    private Button m_buttonOnOff;

    private void init()
    {
        m_buttonOnOff = (Button)this.findViewById(R.id.MAINACTIVITY_BUTTON_ONOFF);
        m_buttonOnOff.setOnClickListener(this); //3.Yöntem
    }
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        this.init();
    }

    @Override
    public void onClick(View v)
    {
        m_buttonOnOff.setText(m_buttonOnOff.getText().toString().compareTo("On") == 0 ? "Off" : "On");
    }
}

EditText (TextBox)(Label)

  • Klavyeden yazı girişini sağlar.
  • android.widget.TextView sınıfından türetilmiştir.
  • android.widget paketi içerisindedir.
    Property'den inputType özelliğiyle kullanıcının sadece istenilen formatta giriş yapması sağlanır.

    • Plain Text : tüm karakterler girilebilir.
    • Person Name: sadece isim
    • email : email formatında
    • ...

activity_main.xml

    android:inputType="textAutoComplete"/> //tek giriş seçimi
android:inputType="number|numberSigned|numberDecimal" //birden fazla giriş için
  • maxLength : EditText'e girilecek olan yazının max uzunluğu
  • maxLines minLines : InputType Multiline seçildiğinde max ve min satır sayısı ile sınırlandırılabilir.

Örnek Kod

EditTexte girilen Text'i Butona basılınca Toast Mesaja yazdır.

content_main.xml

<EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Adinizi Giriniz"
        android:id="@+id/MAINACTIVITY_EDITTEXT_NAME"
        android:inputType="text"
        />


    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/MAINACTIVITY_BUTTON_OK"
        android:text="OK"
        />

MainActivity.java

package csd.samples.gui;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    private EditText m_editTextTest;
    private Button m_button;

    private void init()
    {
        m_editTextTest = (EditText)this.findViewById(R.id.MAINACTIVITY_EDITTEXT_NAME);

        m_button = (Button)this.findViewById(R.id.MAINACTIVITY_BUTTON_OK);
        m_button.setOnClickListener(new View.OnClickListener() 
        {
            @Override
            public void onClick(View v)
            {
                Toast.makeText(getBaseContext(), m_editTextTest.getText().toString(), Toast.LENGTH_SHORT).show();
            }
        });
    }

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        this.init();
    }
}

CheckBox & Switch(Andorid 4.0) Kontrolleri

  • Listener Interface'i CompoundButton.OnCheckedChangeListener
  • Override Edilmesi gereken metod (Ctrl+ O)
    public void onCheckedChanged(CompoundButton compoundButton, boolean b){}
    
  • CheckBox'ın setListener metodu switch.setOnCheckedChangeListener(this);.
  • onClickListiner ile de click metodu yazilabilir.Fakat Android'in Sürümlerinde tema değiştiğinde onClick metodu çalışmayabilir.
  • ID standarti burada da gecerli.
  • xml tarafindan ya da property sekmesinden default degeri degistirilebilir.
  • Screen Orientation'da son konumu kendisi saklar.Xml dosyasındaki tum durumlar otomatik saklanır.
  • Android'de 2 durum söz konusu
    • check
    • uncheck
  • Windows'ta 3 durum söz konusu
    • check
    • uncheck
    • undetermined belirsiz
  • boolean checkBox.isChecked(): check edildi mi
  • void checkBox.setChecked(Boolean b): true check , false uncheck yapar
  • switch1.setTextOff("Off"); false olduğundaki text
  • switch1.setTextOn("On"); true olduğundaki text

Örnek Kod

CheckBox değiştiğinde Toast mesajda checkBox stateini yaz.

  • CompoundButton.OnCheckedChangeListener implemente edilir.
  • onCheckedChanged metodu override edilir.
  • setOnCheckedChangeListener(this) ile Listener set edilir.
  • onCheckedChanged metodu içinde isChecked* ile checkBox kontrol edilir.

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout

    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="org.csystem.checkbox.MainActivity">


    <LinearLayout
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="match_parent">

        <Switch
            android:text="Switch1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/MAINACTIVITY_SWITCH_1"/>

        <Switch
            android:text="Switch2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/MAINACTIVITY_SWITCH_2"/>

        <Switch
            android:text="Switch3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/MAINACTIVITY_SWITCH_3"/>
    </LinearLayout>

</LinearLayout>

MainActivity.java

package org.csystem.checkbox;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.CompoundButton;
import android.widget.Switch;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener
{
    private Switch m_switch1 , m_switch2 , m_switch3;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
    }

    private void init()
    {
        m_switch1 = (Switch)this.findViewById(R.id.MAINACTIVITY_SWITCH_1);
        m_switch2 = (Switch)this.findViewById(R.id.MAINACTIVITY_SWITCH_2);
        m_switch3 = (Switch)this.findViewById(R.id.MAINACTIVITY_SWITCH_3);

        m_switch1.setOnCheckedChangeListener(this);
        m_switch2.setOnCheckedChangeListener(this);
        m_switch3.setOnCheckedChangeListener(this);
    }

    @Override
    public void onCheckedChanged(CompoundButton compoundButton, boolean b)
    {
        Switch s = (Switch)compoundButton;
        Toast.makeText(MainActivity.this , s.isChecked()? s.getText()+" Acik" : s.getText()+" Kapali" , Toast.LENGTH_SHORT).show();
    }
}

Toggle

  • Açma Kapama işlemlerinde kullanılır.
  • Switch Benzeridir.
  • Listener Interface'i OnClickListener
  • toggle.getTextOn()//getTextOff xmlde ya da kodda verilen isimlendirmeleri almakta kullanılır.
  • toogleButton.toogle() diyerek durumunun değili alinanbilir.Butun iki durumlu kontroller icin gecerlidir.
  • boolean checkBox.isChecked(): check edildi mi
  • void checkBox.setChecked(Boolean b): true check , false uncheck yapar

Radio Group

  • Tüm Gui Sistemlerinde bulunur.
  • Birden fazla seçenekden sadece birinin seçilmesini sağlar.
  • Birden fazla oldugu icin gruplayabilmek adina RadioGrouplar vardir.

    • Fiziksel elemanlari gruplandirmak icin = Layout
    • Mantiksal gruplandirma yapmak icin = Viewgroup-Radio Group
  • listeneri RadioButton.OnCheckedChangeListener

RadioGroup

Kullanılacak olan radio butonlarını gruplamak için kullanılır.Ve hangi radio butonun seçildiğini bulmayı kolaylaştırmak içindir.

  • setOnCheckedChangeListener() ile Listineri set edilir.
  • OnCheckedChangeListener sınıfının metodu :

    public void onCheckedChanged(RadioGroup radioGroup, int id)

    • id : hangi radioButton seçildiyse onun idsini veririr.
    • group : hangi radio grubundaki radiobutonun secildigini verir.

Seçili Radio Butonunu bulmanın kolay yolu

Seçili olan butonun id'sini almak için:

RadioButton kb  = (radioGroup)this.findById(m_radioGroupMs.getCheckedRadioButtonId)

Seçili olmayan Radio Butonunu bulmanın kolay yolu

  • getChildCount ile RadioGroupun kac elemani oldugu alinir
  • getChildAt ile View turunden elemanlarina ulasilir.
for(int i=0 ; i< radiosGroup.getChildCount ; i++)
{
    RadioButton rb = getChildAt(i);
    if(!rb.isChecked())
        msg += rb.getText;
}

Test Sorusu Örneği

  • 4 Şıklı bir soru sorulsun ve cevap seçilip butona basılınca doğru yanlıs olarak cevaplansın
  • Seçilen her şıkta bir toast açılır ve seçilen şık ekrana yazıdırılır.
  • Cevabı göster butonuna basılınca seçilen cevap doğru mu yanlış mı kontrol edilir.

content_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="org.csystem.radiogroupsample.MainActivity"
    tools:showIn="@layout/activity_main"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="SORU : 3*4+2 = ?"
        android:id="@+id/textView"/>

    <RadioGroup
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/MAINACTIVITY_RADIOGROUP_QUESTION1">

        <RadioButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="A)18"
            android:id="@+id/MAINACTIVITY_RADIOBUTTON_A"/>

        <RadioButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="B)16"
            android:id="@+id/MAINACTIVITY_RADIOBUTTON_B"/>

        <RadioButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="C)14"
            android:id="@+id/MAINACTIVITY_RADIOBUTTON_C"/>

        <RadioButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="D)12"
            android:id="@+id/MAINACTIVITY_RADIOBUTTON_D"/>

    </RadioGroup>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="CEVABI GOSTER"
        android:id="@+id/MAINACTIVITY_BUTTON_SHOWANSWER"
        android:layout_gravity="center_vertical"/>

</LinearLayout>

MainActivity.java

package org.csystem.radiogroupsample;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast;


public class MainActivity extends AppCompatActivity
{
    private RadioGroup m_radioGroup_question1;
    private Button m_button_showAnswer;

    private void InitializeComponent()
    {
        m_radioGroup_question1 = (RadioGroup)this.findViewById(R.id.MAINACTIVITY_RADIOGROUP_QUESTION1);
        m_button_showAnswer =  (Button) this.findViewById(R.id.MAINACTIVITY_BUTTON_SHOWANSWER);

        //RadioGroup icerisinde hangi RadioButton secilirse onu ekrana yazma Listineri
        m_radioGroup_question1.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup radioGroup, int id)
            {
                RadioButton rb = (RadioButton) MainActivity.this.findViewById(id);
                Toast.makeText(MainActivity.this , String.format("Secilen şık:%s",rb.getText().toString()),Toast.LENGTH_SHORT).show();
            }
        });

        //Butona tiklandiginda secilen cevapla dogru cevabi karsilastir ve ekrana yazdir.
        m_button_showAnswer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view)
            {
                String msg = m_radioGroup_question1.getCheckedRadioButtonId() == R.id.MAINACTIVITY_RADIOBUTTON_C ? "Doğru Cevap" : "Yanlış Cevap";
                Toast.makeText(MainActivity.this , msg ,Toast.LENGTH_SHORT).show();
            }
        });
    }


    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        InitializeComponent();
    }

}