본문 바로가기
안드로이드 웹앱 콘테츠 개발자 양성(국비지원)/Fragment

Android Studio Fragment + Pager 2

by 차누감 2019. 9. 26.

Android Studio Fragment + Pager  1 에서 작성한 코드에서 추가 작업을 해보자

 

<최종 실행 화면>

<1페이지 실행 화면>

<2페이지 실행 화면>

<3페이지 실행 화면>

 

추가 작업 이제  페이지에 1 TextView랑 Button만 추가해보자.

(페이지 백그라운드는 없애자. 페이지가 바뀌는 것을 알아보기 위해 했던 것임)

 

fragment_page1.xml 코드 및 화면 구성

fragment_page1.xml 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    >
 
    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="PAGE 1"
        android:textStyle="bold"
        android:padding="8dp"/>
    <Button
        android:id="@+id/btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/tv"
        android:text="button"
        android:layout_marginTop="8dp"/>
 
</RelativeLayout>
 
s

 

Page1Fragment.java 코드

Page1Fragment.java 코드

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
 
 
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
 
public class Page1Fragment extends Fragment {
    TextView tv;
    Button btn;
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
 
        View view=inflater.inflate(R.layout.fragment_page1,container,false);
 
        tv=view.findViewById(R.id.tv);
        btn=view.findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                tv.setText("Hello world!!");
            }
        });
        //onResume때마다 다시 바뀐 값을 다시 넣어줘야 한다.
        //왜냐.. view가 부셔지면 화면을 다시 만들기 때문에 기입한 정보다 없어진다.
        //위 주석은 아직 구현 안했음
        return view;
    }
}
 
 
 

<1페이지 실행 화면>

 

추가 작업 이제  페이지에 2 Button이랑 imageView만 추가해보자.

(페이지 백그라운드는 없애자. 페이지가 바뀌는 것을 알아보기 위해 했던 것임)

fragment_page2.xml 코드 및 화면 구성

fragment_page2.xml 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    >
 
    <Button
        android:id="@+id/btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="button"/>
 
    <ImageView
        android:id="@+id/iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/btn"
        android:src="@mipmap/ic_launcher"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="8dp"/>
 
</RelativeLayout>
 
 

Page2Fragment.java 코드

Page2Fragment.java 코드

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
 
 
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
 
public class Page2Fragment extends Fragment {
 
    Button btn;
    ImageView iv;
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view=inflater.inflate(R.layout.fragment_page2,container,false);
 
        btn=view.findViewById(R.id.btn);
        iv=view.findViewById(R.id.iv);
 
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                iv.setImageResource(R.drawable.ms17);
            }
        });
        return view;
    }
}
 
 
 

<2페이지 실행 화면>

 

추가 작업 이제  페이지에 3 ListView 추가해보자. (View Pager에 또다른 Adapter를 사용하는 것임)

(페이지 백그라운드는 없애자. 페이지가 바뀌는 것을 알아보기 위해 했던 것임)

 

Page3에 ListView에 보여질 화면 구성

page3_listview_item.xml 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp">
 
    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="TEXT"/>
 
</RelativeLayout>
 
 

이 만든 화면을 Listview에 보여줄 adapter를 만들자.

 

Page3ListAdapter.java 코드

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
 
import android.content.Context;
 
 
public class Page3ListAdapter extends BaseAdapter {
 
    ArrayList<String> datas;
   // LayoutInflater inflater;Context
    //LayoutInflater 말고 다른 방법을 사용 Context
    Context context;
 
    public Page3ListAdapter(ArrayList<String> datas, Context context) {
        this.datas = datas;
        this.context = context;
    }
 
    @Override
    public int getCount() {
        return datas.size();
    }
 
    @Override
    public Object getItem(int position) {
        return datas.get(position);
    }
 
    @Override
    public long getItemId(int position) {
        return position;
    }
 
    @Override
    public View getView(int position, View view, ViewGroup viewGroup) {
 
        //LayoutInflator를 소환하기
        LayoutInflater inflater= LayoutInflater.from(context);
 
        //1. new view
        if(view==null){
            view=inflater.inflate(R.layout.page3_listview_item,viewGroup, false);
            //앞으로 항상 이렇게 쓰자 두 번째 파라미터에 null 쓰지 말고, 이래야 사이즈가 생각되로 나옴.
        }
        //2. bind view
        TextView tv= view.findViewById(R.id.tv);
        tv.setText(datas.get(position));
 
        return view;
    }
}
 
 
 

<3페이지 실행 화면>

그냥 봤을때는 페이지마다 기능도 잘된다. 그러나,여기서 문제가 있다.

문제는 세 번째 페이지 -> 첫번째 페이지로 갔다가... 다시 세번째 페이지로 가보자.

뭔가 이상하지 않은가? 그 이유는  

 "aaa","bbb","ccc"데이터를 어디에서 삽입하는지 보면, 아래 사진과 같이 Page3Fragment.java에

onCreateView인것을 확인할 수 있다. ( 즉 화면이 보이면 onCreateView가 된 것이다.)

 그럼 화면에 보였을때, 데이터는 잘 생성 됐다. 문제는 Pager의 페이지 보여주기에 있다.

( 3개 화면만 쓴다. 아무리 많은 페이지가 있어도...)

이것을 이해하려면 Pager의 페이지 보여주는 방식과 lifecycle을 이해해야한다.

 

결론, pager는 페이지가 아무리 많아도 최대 3개만 사용하므로 View를 없애고, 생성하는 작업을 한다. 

그러나, view가 없어진다고 그 activity.java 문서가 초기화 되는 것은 아니다. 

그러므로 위 Page3 내용을 약간 수정한다. [아래 그림 참고]

(그러면 원하는 동작이 될 것이다. 이 문제는 Page마다 있을 수 있으므로 다른 페이지도 바꾸길 바란다.)

onCreate 오버로드하여 그 안에 내용 기입

 

댓글