Android Studio - Tabbed Activity

요즘에 안드로이드 스튜디오를 공부하고 있어서 그중에서 많이 쓰이는 탭에 대해 공부를 하던 중
tabbed activity가 있고 이것을 사용하면 쉽게 탭창을 만들고 스와이프 할 수 있다는 것을 알았다.

하지만 내가 알고싶은건 기본 tabbed activity에서 아주 살짝 그냥 어디에 쓰면 탭의 이름이 바뀌고 어디에 쓰면 내용이 바뀐다. 이정도만 알고 싶었는데 인터넷은 정보의 바다. 쓸데없는 정보가 너무너무 많다.

그래서 내가 직접 정리 해보았다.

참고 사이트는 외국분의 유튜브를 보고 하였다.
https://wn.com/tutorial_for_creating_android_swiping_application_using_tabbed_activity_on_android_studio

가장 먼저 프로젝트를 만들고 기본 Tabbed activity를 만들고 나는 Action bar tabs를 선택하여 만든 후 실행하면 잘 돌아가지만 나 같은 초보는 이해할수 없고 구글에서 검색해서 찾아도 잘 못찾겠다;;

1

내가 여기서 건든 부분은 메인 엑티비티에 122번째 줄 조금과 프레그멘트가 하나 더 생긴것 정도 밖에 없다.
fragment_first.xml은 fragment_main을 이름만 바꾼 것이다.

메인 엑티비티

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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
package //본인 패키지 적으세요

import android.support.design.widget.TabLayout;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;

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.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;

public class MainActivity extends AppCompatActivity {

/**
* The {@link android.support.v4.view.PagerAdapter} that will provide
* fragments for each of the sections. We use a
* {@link FragmentPagerAdapter} derivative, which will keep every
* loaded fragment in memory. If this becomes too memory intensive, it
* may be best to switch to a
* {@link android.support.v4.app.FragmentStatePagerAdapter}.
*/
private SectionsPagerAdapter mSectionsPagerAdapter;

/**
* The {@link ViewPager} that will host the section contents.
*/
private ViewPager mViewPager;

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

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
// Create the adapter that will return a fragment for each of the three
// primary sections of the activity.
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

// Set up the ViewPager with the sections adapter.
mViewPager = (ViewPager) findViewById(R.id.container);
mViewPager.setAdapter(mSectionsPagerAdapter);

TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);

mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager));

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();
}
});

}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.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);
}

/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {
/**
* The fragment argument representing the section number for this
* fragment.
*/
private static final String ARG_SECTION_NUMBER = "section_number";

public PlaceholderFragment() {
}

/**
* Returns a new instance of this fragment for the given section
* number.
*/
public static PlaceholderFragment newInstance(int sectionNumber) {
PlaceholderFragment fragment = new PlaceholderFragment();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
fragment.setArguments(args);
return fragment;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {

View rootView = null;
switch (getArguments().getInt(ARG_SECTION_NUMBER)){
case 1:
//do something;
rootView = inflater.inflate(R.layout.fragment_first, container, false);
break;
case 2:
// something other
rootView = inflater.inflate(R.layout.fragment_second, container, false);
break;
}

return rootView;
}
}

/**
* A {@link FragmentPagerAdapter} that returns a fragment corresponding to
* one of the sections/tabs/pages.
*/
public class SectionsPagerAdapter extends FragmentPagerAdapter {

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

@Override
public Fragment getItem(int position) {
// getItem is called to instantiate the fragment for the given page.
// Return a PlaceholderFragment (defined as a static inner class below).
return PlaceholderFragment.newInstance(position + 1);
}

@Override
public int getCount() {
// Show 3 total pages.
return 2;
}
}
}

나는 2개의 탭만 만들고 실행하였지만 3개의 탭을 만들고 싶으면 getCount부분을 3으로 바꾸면 된다.

그 후에 레이아웃부분에서 뉴 -> 프레그먼트 -> 프레그먼트(블랭크) 를 눌러 fragment_second를 만들면 클래스 파일도 자동으로 추가 된다.

그 후에 위에 적은 메인엑티비티를 실행하면 잘 동작하고 탭 3개를 쓰는 사람은 프레그먼트 써드를 만든 후 case 3:을 추가하고 getCount 부분도 3으로 바꾸면 된다.

아 그리고 뷰부분을 꾸미고 싶다면 꾸미고 싶은 프레그먼트.xml 파일로 들어가 자기가 원하는 방식으로 꾸미거나 설정하면 이제는 탭 모두가 아니라 하나의 탭만 적용 되는 것을 볼 수 있다.

도움이 될지 안될지 모르는 이상한 글이 되어버렸지만 진짜 조금의 도움이라도 됐으면 좋겠다.