티스토리 뷰

안드로이드 Fragment ( TabLayout, PagerSlidingTabStrip )


안드로이드에서 화면이 출력되는 가장 기본이 되는 것은 Activity 이다. 


Fragment는 Activity 내에 생성되는 것이며, UI를 여러 단위로 작성 할 수 있도록 해주는 것이다. 

또한 Fragment는 재사용이 가능하므로 작업량을 감소시킬 수 있다는 장점이 있다.

Fragment는 자체 생명 주기를 가지고, 자체 입력 이벤트를 받으며, 액티비티 실행 중에 추가 및 제가가 가능한 액티비티의 모듈식 섹션이다.



버튼을 눌러 Fragment가 바뀌는 예제 실습


fragment_lotte.xml

AppBarLayout과 TabLayout을 이용하여 탭 부분을 만들었고, ViewPager를 이용하여 각 Fragment를 이동시키도록 구성하였다.


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".LotteFragment">

<LinearLayout
android:orientation="vertical"
android:id="@+id/header"
android:layout_width="match_parent"
android:layout_height="200dp"
>
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:background="#0072C6"
android:src="@mipmap/lotte1"
android:scaleType="centerCrop"
/>
</LinearLayout>

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


<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

<android.support.design.widget.TabLayout
android:id="@+id/sliding_tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/holo_green_dark"
app:tabIndicatorColor="@android:color/holo_green_light"
app:tabSelectedTextColor="@android:color/white"
app:tabMode="fixed"
app:tabGravity="fill" />


</android.support.design.widget.AppBarLayout>

<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>


</LinearLayout>


그리고 세개의 메뉴에 보여질 fragment 3개를 생성한다.


fragment_lotte_fragment1.xml

선수의 이름을 보여주는 리스트뷰

<RelativeLayout 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=".Lotte.LotteFragment1">

<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

</RelativeLayout>


fragment_lotte_fragment2.xml

경기 일정을 보여주도록 리스트뷰

<FrameLayout 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=".Lotte.LotteFragment2">

<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

</FrameLayout>


fragment_lotte_fragment3.xml

감독의 사진과 이름, 정보

<FrameLayout 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=".Lotte.LotteFragment3">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@mipmap/jo"/>

<TextView
android:id="@+id/info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"/>

<TextView
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"/>
</LinearLayout>

</FrameLayout>


레이아웃을 이렇게 생성하고

다음으로 각 프레그먼트와 ViewPager를 만든다.



LotteFragment1.java


package com.ktds.junho.mydrawablelayout.Lotte;

import android.content.Context;
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.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.ktds.junho.mydrawablelayout.R;

import java.util.ArrayList;
import java.util.List;


public class LotteFragment1 extends Fragment {
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";

private String mParam1;
private String mParam2;

private ListView listView;


public LotteFragment1() {
// Required empty public constructor
}

public static LotteFragment1 newInstance(String param1, String param2) {
LotteFragment1 fragment = new LotteFragment1();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}

}

private class MyListAdapter extends BaseAdapter {

private List<String> list;
private Context context;

public MyListAdapter(Context context) {
this.context = context;

list = new ArrayList<String>();
list.add("강승현");
list.add("강영식");
list.add("권태양");
list.add("김남길");
list.add("김성배");
list.add("김성재");
list.add("김성호");
list.add("김영일");


}

@Override
public int getCount() {
return list.size();
}

@Override
public Object getItem(int position) {
return list.get(position);
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

if ( convertView == null ) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.list_item, parent, false);
}

TextView textView = (TextView) convertView.findViewById(R.id.textView);
textView.setText((String)getItem(position));

textView.setOnClickListener(new TextView.OnClickListener(){
@Override
public void onClick(View v) {
Toast.makeText(v.getContext(), ((TextView) v).getText() + "선택함.", Toast.LENGTH_LONG).show();
}
});

return convertView;

}
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_lotte_fragment1, container, false);

listView = (ListView) view.findViewById(R.id.listView);
listView.setAdapter(new MyListAdapter(this.getContext()));

return view;
}


}


2와 3도 담은 내용에 따라 비슷하게 생성한다.



LotteFragment.java

package com.ktds.junho.mydrawablelayout;

import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.ktds.junho.mydrawablelayout.Lotte.LotteFragment1;
import com.ktds.junho.mydrawablelayout.Lotte.LotteFragment2;
import com.ktds.junho.mydrawablelayout.Lotte.LotteFragment3;

public class LotteFragment extends Fragment {
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";

private String mParam1;
private String mParam2;

public LotteFragment() {
// Required empty public constructor
}

public static LotteFragment newInstance(String param1, String param2) {
LotteFragment fragment = new LotteFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}

private Fragment galleryFragment1;
private Fragment galleryFragment2;
private Fragment galleryFragment3;

private TabLayout tabLayout;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_lotte, container, false);


galleryFragment1 = new LotteFragment1();
galleryFragment2 = new LotteFragment2();
galleryFragment3 = new LotteFragment3();

tabLayout = (TabLayout) rootView.findViewById(R.id.sliding_tabs);
tabLayout.addTab(tabLayout.newTab().setText("선수"));
tabLayout.addTab(tabLayout.newTab().setText("일정"));
tabLayout.addTab(tabLayout.newTab().setText("감독"));
// tabLayout.setupWithViewPager(pager);

final ViewPager pager = (ViewPager)
rootView.findViewById(R.id.viewPager);
final PagerAdapter adapter = new PagerAdapter
(getChildFragmentManager(), tabLayout.getTabCount());
pager.setAdapter(adapter);
pager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
pager.setCurrentItem(tab.getPosition());
}

@Override
public void onTabUnselected(TabLayout.Tab tab) {

}

@Override
public void onTabReselected(TabLayout.Tab tab) {

}
});

getActivity().setTitle("Lotte Fragment");


// Inflate the layout for this fragment
return rootView;
}

private class PagerAdapter extends FragmentPagerAdapter {
int num_tab;
public PagerAdapter(FragmentManager fm, int numOfTabs) {
super(fm);
this.num_tab = numOfTabs;
}

/**
* View Pager Fragment 들은 각각 Index 를 가진다.
* Android OS로 부터 요청된 Pager Index 를 보내주면,
* 해당되는 Fragment 를 리턴시킨다.
* @param position
* @return
*/
@Override
public Fragment getItem(int position) {

if ( position == 0 ){
return galleryFragment1;
}
else if( position == 1 ){
return galleryFragment2;
}
else{
return galleryFragment3;
}

}


/**
* View Pager 에 몇개의 Fragment 가 들어가는지 설정한다.
* @return
*/
@Override
public int getCount() {
return num_tab;
}
}
}



또 하나의 Fragment는 TabLayout이 아닌 PagerSlidingTabStrip으로 탭을 생성하였다.

PagerSlidingTabStrip을 사용하기 위해서는 dependencies에 추가해야한다.


compile 'com.astuetz:pagerslidingtabstrip:1.0.1'





fragment_doosan.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".DoosanFragment">

<LinearLayout
android:orientation="vertical"
android:id="@+id/header"
android:layout_width="match_parent"
android:layout_height="200dp"
>
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:background="#0072C6"
android:src="@mipmap/doosan"
android:scaleType="centerCrop"
/>
</LinearLayout>

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

<com.astuetz.PagerSlidingTabStrip
android:id="@+id/tabs"
app:pstsShouldExpand="true"
app:pstsIndicatorColor="@android:color/holo_red_light"
app:pstsUnderlineColor="@android:color/holo_red_light"
app:pstsDividerColor="@android:color/holo_orange_dark"
android:layout_width="match_parent"
android:layout_height="48dp"></com.astuetz.PagerSlidingTabStrip>

<!-- View Pager Fragment Source Code 로 등록한다.
requiresFadingEdge 는 내용이 더 있다면 가운데를 흐릿하게 만들어주는 것이다.-->
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:requiresFadingEdge="horizontal" />
</LinearLayout>
</LinearLayout>


마찬가지로 3개의 fragment를 생성한다.

fragment_doosan_fragment1.xml

<RelativeLayout 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="com.ktds.junho.mydrawablelayout.Doosan.DoosanFragment1">

<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

</RelativeLayout>


2,3도 똑같이 생성한다.


레이아웃을 생성한뒤 3개의 각 프래그먼트와 ViewPager를 생성한다.

각 프래그먼트는 lotte와 똑같이 구성하였다.


DoosanFragment.java

package com.ktds.junho.mydrawablelayout;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.astuetz.PagerSlidingTabStrip;
import com.ktds.junho.mydrawablelayout.Doosan.DoosanFragment1;
import com.ktds.junho.mydrawablelayout.Doosan.DoosanFragment2;
import com.ktds.junho.mydrawablelayout.Doosan.DoosanFragment3;

public class DoosanFragment extends Fragment {
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";

private String mParam1;
private String mParam2;

public DoosanFragment() {
// Required empty public constructor
}

public static DoosanFragment newInstance(String param1, String param2) {
DoosanFragment fragment = new DoosanFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}

/* private Button btnFirstGallery;
private Button btnSecondGallery;
private Button btnThirdGallery;*/

private ViewPager pager;

private PagerSlidingTabStrip tabs;

private Fragment doosanFragment1;
private Fragment doosanFragment2;
private Fragment doosanFragment3;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_doosan, container, false);


doosanFragment1 = new DoosanFragment1();
doosanFragment2 = new DoosanFragment2();
doosanFragment3 = new DoosanFragment3();

pager = (ViewPager) view.findViewById(R.id.pager);
pager.setAdapter(new PagerAdapter( getChildFragmentManager() ));
pager.setOffscreenPageLimit(3);
pager.setCurrentItem(0);

tabs = (PagerSlidingTabStrip) view.findViewById(R.id.tabs);
tabs.setViewPager(pager);


/* btnFirstGallery = (Button) view.findViewById(R.id.btnFirstGallery);
btnFirstGallery.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
pager.setCurrentItem(0);
}
});

btnSecondGallery = (Button) view.findViewById(R.id.btnSecondGallery);
btnSecondGallery.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
pager.setCurrentItem(1);
}
});

btnThirdGallery = (Button) view.findViewById(R.id.btnThirdGallery);
btnThirdGallery.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
pager.setCurrentItem(2);
}
});*/


getActivity().setTitle("Doosan Fragment");

// Inflate the layout for this fragment
return view;
}

private String[] pageTitle = {"선수", "일정", "감독"};

private class PagerAdapter extends FragmentPagerAdapter {

public PagerAdapter(FragmentManager fm) {
super(fm);
}

@Override
public CharSequence getPageTitle(int position) {
return pageTitle[position];
}

/**
* View Pager Fragment 들은 각각 Index 를 가진다.
* Android OS로 부터 요청된 Pager Index 를 보내주면,
* 해당되는 Fragment 를 리턴시킨다.
* @param position
* @return
*/
@Override
public Fragment getItem(int position) {

if ( position == 0 ){
return doosanFragment1;
}
else if( position == 1 ){
return doosanFragment2;
}
else {
return doosanFragment3;
}


}


/**
* View Pager 에 몇개의 Fragment 가 들어가는지 설정한다.
* @return
*/
@Override
public int getCount() {
return 3;
}
}
}


(추가)

MainActivity.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
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package com.ktds.junho.mydrawablelayout;
 
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.NavigationView;
import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
 
public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {
 
    private Fragment LotteFragment;
    private Fragment doosanFragment;
    private Fragment lgFragment;
 
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        LotteFragment = new LotteFragment();
        doosanFragment = new DoosanFragment();
        lgFragment = new LgFragment();
 
        /**
         * 기본 화면 설정
         */
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.add(R.id.container, LotteFragment);
//        transaction.addToBackStack(null);
        transaction.commit();
 
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
 
 
 
        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action"null).show();
            }
        });
 
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();
 
        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
    }
 
    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
 
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
 
        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }
 
        return super.onOptionsItemSelected(item);
    }
 
    /**
     * @see NavigationView.OnNavigationItemSelectedListener
     * @param item
     * @return
     */
    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
 
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
 
        // Handle navigation view item clicks here.
        int id = item.getItemId();
 
        if (id == R.id.nav_camera) {
            transaction.replace(R.id.container, LotteFragment);
        } else if (id == R.id.nav_gallery) {
            transaction.replace(R.id.container, doosanFragment);
        } /*else if (id == R.id.nav_slideshow) {
        } else if (id == R.id.nav_manage) {
        } else if (id == R.id.nav_share) {
        } else if (id == R.id.nav_send) {
        } */else if (id == R.id.nav_subway) {
            transaction.replace(R.id.container, lgFragment);
        }
 
//        transaction.addToBackStack(null);
        transaction.commit();
 
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }
}
 
cs


결과 화면은 똑같은 구성으로 보여진다.







'Android' 카테고리의 다른 글

[Android] Android Landscape (가로모드)  (1) 2016.08.05
[Android] Android SQLite  (0) 2016.08.04
[Android] APK 생성  (0) 2016.07.29
[Android] ListView (리스트 뷰)  (0) 2016.07.29
[Android] 웹에 요청하기  (0) 2016.07.26
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
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
글 보관함