fragment_project_hierarchyBir önceki derste, Android’de Fragmentlar’ ın ne olduğuna, neden Fragment’lara ihtiyaç duyulduğuna değindim. Bu derste de Fragment‘ların kodlamada nasıl kullanıldığına dair örnek bir uygulama yapacağım. Yapacağımız işlemi kısaca açıklayayım, ardından kod bloğu incelemesi ve açıklamalarıyla yazıyı bitireceğim. Resimdeki proje hiyerarşisini incelediğinizde dosyaların konumu hakkında bilgi sahibi olmuş olacaksınız. Bu uygulamayı anladığınızda;

  • Fragment kulanımı
  • ScrollView kullanımı
  • strings.xml dosyasının amacı ve bu dosyadan string çekme
  • Androidmanifest.xml dosyası içindeki Activity nesnelerinin kalıcı olarak yatayda ya da dikeyde konumlanması


gibi işlemleri kavramış olacaksınız.

Activity nesnelerinin ekrana bastırılma metotlarını biliyorsunuzdur; onCreate metotları. Fragment nesnesinden kalıtım alan bir sınıfta ise görünümler, geri dönüş değeri View olan onCreateView metodu içinde oluşturulur. onCreateView metoduna değişken olarak gelen LayoutInflater nesnesinin inflate metodu ile View değişkenine atanan Layout nesneleri, yine bu View nesnesinin döndürülmesiyle ekranda görüntülenir. Şimdi bu anlatılanları örnekleyelim.

Fragment nesnelerinin bir activity nesnesi üzerinde değiştirilerek kullanıldığını söylemiştim. Bu uygulamada, main activity niteliği taşıyan bir tek Activity sınıfı bulunmakta. Bu Activity nesnesi üzerindeki fragment bileşenlerinin yerlerinin değiştirilmesi suratiyle uygulama tamamlanacak. Activity sınıfının yanı sıra iki sınıf daha oluşturduk. Bu sınıflar da Fragment sınıfından kalıtım almakta. Activity nesnesinin Layout görünümünde yer alan iki boş bileşen, Fragment sınıflarında yer alan görünümler için bir Container(Parent) görevi görecek.



 

ÖNEMLİ NOT !

Fragment özelliği, API Level 11 ile gelmiş olan bir özellik. Bu özelliğin API Level 11′ den önce de çalışması için support library adında kütüphaneler mevcut. Biz de Fragment görünümlerini oluştururken bu kütüphaneden yararlanacağız ve Fragment nesnelerimizi “android.support.v4.app.Fragment” sınıfından kalıtım alan sınıflardan türeteceğiz. Önemli bir nokta burası;”android.app.Fragment” sınıfından değil, “android.support.v4.app.Fragment” sınıfından kalıtım almalıyız. Import işlemi sırasında bu noktaya dikkat etmelisiniz.

Uygulamaya kısaca değindikten sonra kodlarına göz atalım. Uygulama yatayda(Landscape) çalışıyor ve kullanıcı bilgilerini alıp Kaydol tuşuna bastığınızda yan panelde kullanıcı bilgilerini gösteriyor. Yani bir kaydolma işleminin arayüz demosu diyebiliriz. Uygulama üzerindeki yorum satırları anlaşılmayı kolaylaştıracağından kısa özetin ardından kod bloklarını inceleyebiliriz.

Öncelikle strings.xml dosyasından başlayalım:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">SerefakyuzFragments</string>
    <string name="action_settings">Settings</string>
    <string name="hello_world">Hello world!</string>
   
    <string name="fragment1">Fragment 1</string>
    <string name="fragment2">Fragment 2</string>
    <string name="first_name">Ad: </string>
    <string name="second_name">Soyad: </string>
    <string name="age">Yaş: </string>
    <string name="Location">Şehir: </string>
    <string name="signin">Kaydol</string>
    <string name ="fields_should_be_filled">"Lütfen tüm alanları doldurunuz!"</string>

</resources>

Uygulamanızda kullanacağınız metinleri strings.xml dosyasında tutmak hem yazılım açısından hem de standartlar açısından iyi bir yoldur. Düzenlemelerde size kolaylık sağlar. Layout içeriklerine geçelim:

Main Layout’ a ait xml dosyası(serefakyuz_com_main_activity.xml):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<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="fill_parent"
   android:orientation="horizontal"
   tools:context=".SerefakyuzComFragmentActivity" >

    <LinearLayout
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:layout_weight="1"
       android:orientation="vertical" >

        <ScrollView
           android:layout_width="fill_parent"
           android:layout_height="fill_parent"
           android:layout_weight="1" >

            <LinearLayout
               android:id="@+id/user_infosFragment"
               android:name="com.example.fragments"
               android:layout_width="fill_parent"
               android:layout_height="wrap_content"
               android:layout_margin="5dp"
               android:orientation="horizontal" >
            </LinearLayout>
        </ScrollView>

        <Button
           android:id="@+id/btn_signup"
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"
           android:text="@string/signin" />
    </LinearLayout>

    <View
       android:id="@+id/view1"
       android:layout_width="1dp"
       android:layout_height="wrap_content"
       android:background="#012345" />

    <ScrollView
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:layout_weight="1" >

        <LinearLayout
           android:id="@+id/user_detailsFragment"
           android:name="com.example.fragments"
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"
           android:layout_margin="5dp"
           android:orientation="horizontal" >
        </LinearLayout>
    </ScrollView>

</LinearLayout>


Fragment nesnelerinden ilkinin görünüm dosyası(fragment_user_infos.xml):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical"
   android:paddingTop="5dp" >

    <TextView
       android:id="@+id/textView2"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_marginTop="10dp"
       android:text="@string/fragment1"
       android:textAppearance="?android:attr/textAppearanceLarge" />

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

        <TextView
           android:id="@+id/TextView03"
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"
           android:layout_gravity="center_vertical"
           android:text="@string/first_name" />

        <EditText
           android:id="@+id/et_name"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_gravity="center_vertical"
           android:layout_weight="1"
           android:ems="10" />
    </LinearLayout>

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

        <TextView
           android:id="@+id/textView1"
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"
           android:text="@string/second_name" />

        <EditText
           android:id="@+id/et_secondName"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_weight="1"
           android:ems="10" >
        </EditText>
    </LinearLayout>

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

        <TextView
           android:id="@+id/TextView02"
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"
           android:layout_gravity="center_vertical"
           android:text="@string/age" />

        <EditText
           android:id="@+id/et_age"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_gravity="center_vertical"
           android:layout_weight="1"
           android:ems="10" />
    </LinearLayout>

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

        <TextView
           android:id="@+id/TextView01"
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"
           android:layout_gravity="center_vertical"
           android:text="@string/Location" />

        <EditText
           android:id="@+id/et_location"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_gravity="center_vertical"
           android:layout_weight="1"
           android:ems="10" />
    </LinearLayout>

</LinearLayout>

Fragment nesnelerinden ikincisinin görünüm dosyası(fragment_user_details.xml):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="match_parent"
   android:orientation="vertical" >

    <TextView
       android:id="@+id/textView1"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="@string/fragment2"
        android:layout_marginTop="30dp"
       android:textAppearance="?android:attr/textAppearanceLarge" />

    <LinearLayout
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:layout_margin="10dp"
       android:orientation="horizontal" >

        <TextView
           android:id="@+id/TextView01"
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"
           android:layout_weight="1"
           android:text="@string/first_name" />

        <TextView
           android:id="@+id/TextViewName"
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"
           android:layout_gravity="center_vertical"
           android:layout_weight="1"
           android:text="TextView" />
    </LinearLayout>

    <LinearLayout
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:layout_margin="10dp"
       android:orientation="horizontal" >

        <TextView
           android:id="@+id/TextView02"
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"
           android:layout_weight="1"
           android:text="@string/second_name" />

        <TextView
           android:id="@+id/TextViewSecondName"
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"
           android:layout_gravity="center_vertical"
           android:layout_weight="1"
           android:text="TextView" />
    </LinearLayout>

    <LinearLayout
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:layout_margin="10dp"
       android:orientation="horizontal" >

        <TextView
           android:id="@+id/TextView03"
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"
           android:layout_weight="1"
           android:text="@string/age" />

        <TextView
           android:id="@+id/TextViewAge"
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"
           android:layout_gravity="center_vertical"
           android:layout_weight="1"
           android:text="TextView" />
    </LinearLayout>

    <LinearLayout
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:layout_margin="10dp"
       android:orientation="horizontal" >

        <TextView
           android:id="@+id/TextView04"
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"
           android:layout_weight="1"
           android:text="@string/Location" />

        <TextView
           android:id="@+id/TextViewLocation"
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"
           android:layout_gravity="center_vertical"
           android:text="TextView"
           android:layout_weight="1" />

    </LinearLayout>

</LinearLayout>


Bu görünümleri yöneteceğimiz sınıfların içeriklerine geçelim.
SerefakyuzComFragmentActivity.java (Ana sınıf)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package com.serefakyuz.com.fragments;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class SerefakyuzComFragmentActivity extends FragmentActivity {


    Button btnSignup;
   
    UserInfosFragment userInfosFragment;
    UserDetailsFragment userDetailsFragment;
   
    String firstName = "";
    String secondName = "";
    String age = "";
    String location = "";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.serefakyuz_com_main_activity);
       
        // Fragment yer değişimi için gerekli nesneler oluşturuluyor
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
       
        userInfosFragment = new UserInfosFragment();
        //serefakyuz_com_main_activity içinde bulunan linearlayout içine fragment nesnesinin aktarılması işlemi tanımlanıyor
        fragmentTransaction.replace(R.id.user_infosFragment, userInfosFragment);
       
        userDetailsFragment = new UserDetailsFragment();
        //serefakyuz_com_main_activity içinde bulunan linearlayout içine fragment nesnesinin aktarılması işlemi tanımlanıyor
        fragmentTransaction.replace(R.id.user_detailsFragment, userDetailsFragment);
        // yer değiştirme işlemleri uygulanıyor
        fragmentTransaction.commit();

        btnSignup = (Button) findViewById(R.id.btn_signup);
        btnSignup.setOnClickListener(new OnClickListener() {
           
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                if(getFieldStrings())
                {
                    setDetailsFieldStrings();
                }else{
                    Toast.makeText(getApplicationContext(), getString(R.string.fields_should_be_filled), Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    private boolean getFieldStrings()
    {
        firstName = userInfosFragment.etFirstName.getText().toString();
        secondName = userInfosFragment.etSecondName.getText().toString();
        age = userInfosFragment.etAge.getText().toString();
        location = userInfosFragment.etLocation.getText().toString();
        if(firstName.equals("") || secondName.equals("") || age.equals("") || location.equals("")){
            return false;
        }else{
            return true;
        }
    }
    private void setDetailsFieldStrings()
    {
        userDetailsFragment.tvFirstName.setText(firstName);
        userDetailsFragment.tvSecondName.setText(secondName);
        userDetailsFragment.tvAge.setText(age);
        userDetailsFragment.tvLocation.setText(location);
    }
   
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.serefakyuz_com, menu);
        return true;
    }
   
}

UserInfosFragment.java(Fragment1)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.serefakyuz.com.fragments;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;

public class UserInfosFragment extends Fragment{

    public EditText etFirstName;
    public EditText etSecondName;
    public EditText etAge;
    public EditText etLocation;
   
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View viewUserInfos = inflater.inflate(R.layout.fragment_user_infos, container, false);
       
        etFirstName = (EditText) viewUserInfos.findViewById(R.id.et_name);
        etSecondName = (EditText) viewUserInfos.findViewById(R.id.et_secondName);
        etAge = (EditText) viewUserInfos.findViewById(R.id.et_age);
        etLocation = (EditText) viewUserInfos.findViewById(R.id.et_location);
       
        return viewUserInfos;
    }
}

UserDetailsFragment.java(Fragment2)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.serefakyuz.com.fragments;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class UserDetailsFragment extends Fragment{

    public TextView tvFirstName;
    public TextView tvSecondName;
    public TextView tvAge;
    public TextView tvLocation;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View viewUserDetails = inflater.inflate(R.layout.fragment_user_details, container, false);
       
        tvFirstName = (TextView)viewUserDetails.findViewById(R.id.TextViewName);
        tvSecondName = (TextView)viewUserDetails.findViewById(R.id.TextViewSecondName);
        tvAge = (TextView)viewUserDetails.findViewById(R.id.TextViewAge);
        tvLocation = (TextView)viewUserDetails.findViewById(R.id.TextViewLocation);
       
        return viewUserDetails;
    }
}

Görüldüğü üzere; ana sınıf içinden, fragment nesneleri aracılığı ile TextView ve EditText bileşenlerine ulaşabildik. Bundan sonrası, parçaları birleştirip uygulamayı çalıştırıp kod üzerinde oynamalarla konuyu sindirme işlemi. Projeyi buradan indirebilirsiniz. İyi çalışmalar.

10 Comments to “Android Programlama Dersleri 6: Fragment Kullanımı(Örnek Uygulama)”

Post comment

Time limit is exhausted. Please reload the CAPTCHA.