serefakyuzFragmentsBir önceki derste, Android’de Fragmentlar’ ın nasıl yer değiştirildiğine değindim. Bu derste de Fragment‘lar arasında nasıl veri alışverişi yapıldığına değineceğim. 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’ lar arası veri iletişimini
  • Köprü Tasarım Deseni(Bridge Design Pattern)
  • 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.

Fragment nesneleri arasında işlem yaparken bazen bir Fragment’ tan diğerine bir değer göndermek isteyebilirsiniz. Ve bu değerler Fragment’ ların oluşum sırasında değil de bir butona basıldığında ya da bir view ile herhangi bir işlem yapıldığında veriyi, değişkeni gönderme ihtiyacı duyabiliriz. Bu gibi durumlarda bu verileri iletmek için bir tasarım deseni(Desing Pattern) kullanmak durumundayız. Bridge Design Pattern’ a ihtiyaç duyduğumuz nokta; Birinci Fragment içinde bulunan buton nesnesinin click event’ ını yakalamak olacaktır. (Bir önceki derste buton nesnesi ana görünümün içindeydi. Bu yüzden SerefakyuzComFragmentActivity sınıfının içinde doğrudan bu butonun click event’ ına ulaşabiliyorduk.)



 

Ö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
<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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    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>
    </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
104
105
106
107
108
109
<?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>

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

</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
package com.serefakyuz.com.fragments;

import android.os.Bundle;
import android.support.v4.app.Fragment;
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;

// Tanımlanan interface, kaydol butonuna basıldığında çalışacak olan onButtonPressed metodunu içeriyor
public class SerefakyuzComFragmentActivity extends FragmentActivity implements OnButtonPressListener{


    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);
       
       
        userInfosFragment = new UserInfosFragment();
        replaceFragments(R.id.user_infosFragment, userInfosFragment);
       
        userDetailsFragment = new UserDetailsFragment();
        replaceFragments(R.id.user_detailsFragment, userDetailsFragment);
       
    }

    // UserInfosFragment sınıfı içindeki kaydol butonuna basıldığında bu metot tetiklenir
    @Override
    public void onButtonPressed(String[] details) {
        // TODO Auto-generated method stub
            userDetailsFragment.setTextViewTexts(details);
    }
   
    private void replaceFragments(int fragmentId, Fragment fragment){
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        //  serefakyuz_com_main_activity içinde bulunan linearlayout içine
        //  fragment nesnesinin aktarılması işlemi tanımlanıyor
        fragmentTransaction.replace(fragmentId, fragment);
        // yer değiştirme işlemleri uygulanıyor
        fragmentTransaction.commit();
    }
}

Bridge tasarım deseni için gerekli interface’ te onButtonPressed isimli bir metot tanımlı durumda.
OnButtonPressListener.java

1
2
3
4
5
package com.serefakyuz.com.fragments;

public interface OnButtonPressListener {
    public void onButtonPressed(String [] details);
}

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
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
package com.serefakyuz.com.fragments;

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

public class UserInfosFragment extends Fragment{

    public EditText etFirstName;
    public EditText etSecondName;
    public EditText etAge;
    public EditText etLocation;
    Button btnSignup;
   
    String firstName = "";
    String secondName = "";
    String age = "";
    String location = "";  

    UserDetailsFragment userDetailsFragment;
    OnButtonPressListener buttonPressedListener;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View viewUserInfos = inflater.inflate(R.layout.fragment_user_infos, container, false);
        buttonPressedListener = (OnButtonPressListener) getActivity();
       
        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);
       
        btnSignup = (Button) viewUserInfos.findViewById(R.id.btn_signup);
        btnSignup.setOnClickListener(new OnClickListener() {
           
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                if(getFieldStrings())
                {
                    // Butona basıldığında, SerefakyuzComFragmentActivity sınıfındaki onButtonPressed metodunu tetikliyoruz
                    buttonPressedListener.onButtonPressed(new String[]{firstName, secondName, age, location});
                }else{
                    Toast.makeText(getActivity().getApplicationContext(), getString(R.string.fields_should_be_filled), Toast.LENGTH_SHORT).show();
                }
            }
        });
       
        return viewUserInfos;
    }
   
    private boolean getFieldStrings()
    {
        firstName = etFirstName.getText().toString();
        secondName = etSecondName.getText().toString();
        age = etAge.getText().toString();
        location = etLocation.getText().toString();
        if(firstName.equals("") || secondName.equals("") || age.equals("") || location.equals("")){
            return false;
        }else{
            return true;
        }
    }
}

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
29
30
31
32
33
34
35
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;
    }
   
    public void setTextViewTexts(String [] details){
        tvFirstName.setText(details[0]);
        tvSecondName.setText(details[1]);
        tvAge.setText(details[2]);
        tvLocation.setText(details[3]);
    }
}

Bir önceki derste Fragment kullanımını ve yer değiştirme işlemini anlattığım örneği geliştirerek bu örnekte kullandım. Bu örneği oluştururken, ana sınıftan değil de bilgileri direkt fragment içinde alıp diğer fragment’ a iletmek için bir interface oluşturdum. İşte Bridge tasarım desenini kullandığım nokta tam da burasıydı. Bu interface ve içinde tanımladığım metot yardımı ile diğer Fragment’ a verileri taşıdım. Aynı örnek, ama veri iletim şekli farklı. Android programlama derslerinin yedincisinde Fragment’lar arasında veri iletişimini örneklemiş olduk.

2 Comments to “Android Programlama Dersleri 7: Fragment’lar Arasında Veri Aktarımı”

Post comment

Time limit is exhausted. Please reload the CAPTCHA.