티스토리 뷰
탭을 사용하면 한 화면에서 서로 다른 두가지 화면의 정보를 전환하면서 보여줄 수 있다.
- 먼저 com.android.support.design라이브러리를 추가한다.
File탭 - project structure - app - dependencies에서 (+)추가 버튼을 누른다. 그리고 Library dependency선택 후 해당 라이브러리를 추가한다.
- 메인 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 | <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.choonie.tapapp.MainActivity"> <!-- CoordinatorLayout이 화면의 전체 위치를 잡아준다. --> <android.support.design.widget.CoordinatorLayout android:layout_width="match_parent" android:layout_height="match_parent"> <!-- AppBarLayout에는 툴바가 들어 갈 수 있는데.. 탭 기능을 사용하면 탭 도 추가할 수 있다. 툴바는 액션바와 비슷한 것이다. --> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/colorPrimaryDark" android:elevation="1dp" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> <TextView android:id="@+id/titleText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="타이틀" android:textAppearance="@style/Base.TextAppearance.Widget.AppCompat.Toolbar.Title" /> </android.support.v7.widget.Toolbar> <!-- tabMode="fixed"와 tabGravity="fill"로 하면 탭의 크기가 모두 동일하도록 설정 한다. --> <android.support.design.widget.TabLayout android:id="@+id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/background_light" android:elevation="1dp" app:tabGravity="fill" app:tabMode="fixed" app:tabSelectedTextColor="@color/colorAccent" app:tabTextColor="@color/colorPrimary" /> </android.support.design.widget.AppBarLayout> <!-- AppBarLayout아래에 이처럼 전환되는 화면을 구성하도록 FrameLayout을 둘 수 있다. --> <FrameLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"> </FrameLayout> </android.support.design.widget.CoordinatorLayout> </RelativeLayout> | cs |
- 탭을 사용하는 것은 한 액티비비에서 화면이 전환되는 것이기 때문에. 프래그먼트(fragment)를 사용해야 한다. 메인에서 사용하기 위한 프래그먼트(java, xml)를 작성한다
app/java/패키지/fragment/FragmentOne
1 2 3 4 5 6 7 8 | public class FragmentOne extends Fragment { @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment1, container, false); return view; } } | cs |
app/res/layout/fragment1.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?xml version="1.0" encoding="utf-8"?> <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="match_parent" android:background="@android:color/holo_blue_light" android:orientation="vertical" tools:context="com.example.choonie.tapapp.MainActivity"> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="첫번째" /> </LinearLayout> | cs |
위 코드를 참조해서 배경색을 다르게 해서 새로운 프래그먼트를 만든다.
ex)fragment2.xml, fragment3.xml
ex)FragmentTwo.java, FragmentThree.java
- 메인 자바 파일을 작성한다.
public class MainActivity extends AppCompatActivity { //툴바를 저장할 변수 private Toolbar bar; //작성한 프래그먼트를 초기화할 변수 private FragmentOne f1; private FragmentTwo f2; private FragmentThree f3; private FrameLayout frameLayout; //터치할 때 저장된 탭의 위치값을 가져올 변수 private int idx; //왼쪽, 오른쪽 슬라이드 판별 변수 private float xUp, xDown; //프래그먼트 매니저 변수 private FragmentManager fm; private TabLayout tabLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); frameLayout = (FrameLayout) findViewById(R.id.container); bar = (Toolbar) findViewById(R.id.toolbar); //setSupportActionBar메서드는 액션바를 인자에 설정한 툴바로 대신한다. //그러나 액션바가 없을 경우에만 동작하므로 //res/values/styles.xml파일을 열고 parent속성을 Theme.AppCompat.Light.NoActionBar로 변경해야 적용된다. setSupportActionBar(bar); ActionBar actionBar = getSupportActionBar(); actionBar.setDisplayShowTitleEnabled(false); //각각의 프래그먼트를 사용하기 위해 초기화 f1 = new FragmentOne(); f2 = new FragmentTwo(); f3 = new FragmentThree(); //프래그먼트를 관리하기 위해 프래그먼트 매니저 초기화 fm = getSupportFragmentManager(); //처음 화면은 f1으로 한다. fm.beginTransaction().replace(R.id.container, f1).commit(); //탭레이아웃 정보를 xml에서 찾은 후 새로운 탭들을 등록 추가 tabLayout = (TabLayout) findViewById(R.id.tabs); tabLayout.addTab(tabLayout.newTab().setText("통화기록")); tabLayout.addTab(tabLayout.newTab().setText("스팸기록")); tabLayout.addTab(tabLayout.newTab().setText("연락처")); tabLayout.addTab(tabLayout.newTab().setText("비공개 정보")); tabLayout.addTab(tabLayout.newTab().setText("공개 정보")); //탭을 눌렀을 때 작동하는 리스너 등록 tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { int position = tab.getPosition(); idx = position; setTabPositionToReplace(position); } @Override public void onTabUnselected(TabLayout.Tab tab) { } @Override public void onTabReselected(TabLayout.Tab tab) { } }); //frameLayout영역에 대하여 터치했을 때 작동하는 리스너 등록 frameLayout.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { xDown = motionEvent.getX(); } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) { xUp = motionEvent.getX(); if (xUp > xDown) { --idx; if (0 > idx) { ++idx; return false; } TabLayout.Tab tab = tabLayout.getTabAt(idx); tab.select(); setTabPositionToReplace(idx); } else if (xUp < xDown) { ++idx; if (tabLayout.getTabCount() - 1 < idx) { --idx; return false; } TabLayout.Tab tab = tabLayout.getTabAt(idx); tab.select(); setTabPositionToReplace(idx); } } return true; } }); } //매개변수의 위치값 대로 FrameLayout에 위치하는 프래그먼트를 전환한다. private void setTabPositionToReplace(int position) { Fragment selected = null; boolean replace = true; if (position == 0) { selected = f1; } else if (position == 1) { selected = f2; } else if (position == 2) { selected = f3; } else { replace = false; Toast.makeText(MainActivity.this, "정보가 없는 탭입니다.", Toast.LENGTH_SHORT).show(); } if (replace) fm.beginTransaction().replace(R.id.container, selected).commit(); } } | cs |
탭을 눌렀을 때만 작동하는 코드만 있었으므로, 좌우 슬라이드로 작동하도록 코드를 추가해 보았다.
'Android > 정리' 카테고리의 다른 글
리스트 뷰 (ListView) (0) | 2016.09.07 |
---|---|
키패드 (0) | 2016.09.04 |
SeekBar (0) | 2016.08.04 |
WebView사용하기 (웹뷰) (0) | 2016.06.14 |
Androdmanifest.xml의 configchanges속성 (0) | 2016.06.10 |
Comments