[build.gradle]
아래 내용 추가

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.android.support:design:24.0.0'
}

 

 

 

 

[styles.xml]

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

</resources>

 

 

 

 

 

[tab_fragment_1.xml]  2~3도 생성 필요

<?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:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="This is Tab 1111"
        android:textAppearance="?android:attr/textAppearanceLarge"/>

</RelativeLayout>

 

 

 

 

[activity_main.xml]

<?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:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="org.example.farmkim.tabbase02.MainActivity">


    <!--Custom Toolbar-->
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?attr/colorPrimary"
        android:minHeight="?attr/actionBarSize"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        android:popupTheme="@style/ThemeOverlay.AppCompat.Light" />


    <android.support.design.widget.TabLayout
        android:id="@+id/tabLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?attr/colorPrimary"
        android:minHeight="?attr/actionBarSize"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />


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


</LinearLayout>

 

 

 

 

[TabFragment1 ~ 3]
- 아래는 1만 존재 2,3을 생성해서 하면 됨

package org.example.farmkim.tabbase02;

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


/**
 * Created by Junyoung on 2016-06-23.
 */


public class TabFragment1 extends Fragment {


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.tab_fragment_1, container, false);
    }
}

 

 

 

 

 

[MainActivity]

package org.example.farmkim.tabbase02;

import android.graphics.Color;
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.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    private TabLayout tabLayout;
    private ViewPager viewPager;

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

        //-----------------------------------------------------------
        // Adding Toolbar to the activity
        //-----------------------------------------------------------
        // 아래 두 문장이 있어야 상단 toolbar 영역에 title이 조회 됨
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        toolbar.setTitle("farmer Toolbar"); //Toolbar title명
        toolbar.setTitleTextColor(Color.BLUE); //타이틀 글자 색
        toolbar.setSubtitle("난 sub title");  //타이틀 아래 작은 글씨로 부제목 표시
        toolbar.setSubtitleTextColor(Color.MAGENTA);  //부제목의 글자색
        toolbar.setNavigationIcon(R.mipmap.ic_launcher); //좌측에 메뉴(네비게이션)아리콘 설정
        setSupportActionBar(toolbar);

        //-----------------------------------------------------------
        // Tab 추가
        // Initializing the TabLayout
        //-----------------------------------------------------------
        tabLayout = (TabLayout) findViewById(R.id.tabLayout);
        tabLayout.addTab(tabLayout.newTab().setText("Tab One"));
        tabLayout.addTab(tabLayout.newTab().setText("Tab Two"));
        tabLayout.addTab(tabLayout.newTab().setText("Tab Three"));
        tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

        //-----------------------------------------------------------
        // Initializing ViewPager
        //-----------------------------------------------------------
        viewPager = (ViewPager) findViewById(R.id.pager);

        // Creating TabPagerAdapter adapter
        TabPagerAdapter pagerAdapter = new TabPagerAdapter(getSupportFragmentManager(), tabLayout.getTabCount());

        // 이때 첫번째 tab에 대한 page가 조회 됨
        // viewPager.setAdapter() : 메소드는 ViewPager에 pagerAdapter를 연결시켜준다.
        // 질문 : 그런데, 맨 처음 왜 첫번째페이지가 조회 되는지 모르겠음 ????
        viewPager.setAdapter(pagerAdapter);

        // 주석 처리 해도 현재 플젝에서는 정상작동
        // addOnTabSelectedListener()가 먼저 수행되고 addOnPageChangeListener()가 수행 됨
        // 상세설명 : http://itpangpang.tistory.com/290
        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)
        {
            /*
            스크롤 효과가 나는 동안 계속해서  호출되는 부분이다
            position(0) = 첫번째 탭이었다가
            position(1) = 두번째 탭으로 이동되는 순간1로 변한다.
             */
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
            {
                Log.d("ITPANGPANG","onPageScrolled : "+position);
            }

            /*
              이 놈은 포지션(페이지 위치)과는 전혀 상관이 없다.
              위의 로그찍은걸 보면 매개변수값으로 state값을 받는다.
              그냥 페이지의 상태자체입다.
              state는(0,1,2) 총 3가지 값이 존재합니다.
                  0 : SCROLL_STATE_IDLE
                  1 : SCROLL_STATE_DRAGGING
                  2 : SCROLL_STATE_SETTLING

                  IDLE = 뜻은 가동되지 않은(즉 종료시점이라고 볼 수 있다.)
                  DRAGGING = 뜻 그대로 드래그 되고 있다(Swipe 될 때 호출됩니다. 조금 있다가 확인)
                  SETTLING = 뜻은 고정(정해졌다)이라는 뜻

              사용자가 Swipe로 화면을 끄는것이 아니라서 1(DRAGGING)은 찍히지 않는다.
              0 -> 2 : 두번째 탭을 누르는 순간 탭은 확실히 2번째라고 결정났으니
              (0을) 먼저 찍어주고 그 다음 가동이 종료되면 (남은 페이지 넘어가는효과(스크롤되는중)가 없는 순간) 2번을 찍어준다.
             */
            @Override
            public void onPageScrollStateChanged(int state)
            {
                Log.d("ITPANGPANG","onPageScrollStateChanged : "+state);
            }

            /*
            역시나 Log찍은 코드를 보면  매개변수로 position을 받는다.
            즉, 선택된 페이지를 알려준다.
            Log를 보면 onPageScrollStateChanged : 2  -> 바로 다음에 onPageSelected : 1  가 찍힌 것을 확인 할 수 있다.
            onPageSelected는 ScrollStateChanged = 2라고 결정난 후에야 호출된다.
            2라는 뜻이 무조건 그 페이지가 선택되었다
            고정(정해졌다)이라는 뜻이므로 그때서야 포지션에 맞게 로그를 찍어주는 것이다.
            (단 Swipe가 아닌 선택으로 넘겼을때)
             */
            @Override
            public void onPageSelected(int position)
            {
                Log.d("ITPANGPANG","onPageSelected : "+position);

            }
        });

        // Set TabSelectedListener
        tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {

            //새로운 tab을 클릭 시 호출 됨
            //이때 ViewPager에 새로운 페이지를 보여줌.
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                Log.d("ITPANGPANG","---onTabSelected : "+tab.getPosition());
                //Toast.makeText(getApplicationContext(), "onTabSelected  11 ", Toast.LENGTH_SHORT).show();
                viewPager.setCurrentItem(tab.getPosition());
            }

            //다른 tab을 클릭 시 호출 됨 (신규 tab에 대한  onTabSelected()메소드 호출 전에  아래 메소드가 먼저 호출 됨)
            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
                //Toast.makeText(getApplicationContext(), "onTabUnselected  22", Toast.LENGTH_SHORT).show();
                Log.d("ITPANGPANG","---onTabUnselected : "+tab.getPosition());
            }

            //현재 활성화 되어 있는 tab을 클릭 시 호출
            @Override
            public void onTabReselected(TabLayout.Tab tab) {
                //Toast.makeText(getApplicationContext(), "onTabReselected 33", Toast.LENGTH_SHORT).show();
                Log.d("ITPANGPANG","---onTabReselected : "+tab.getPosition());
            }
        });
    }

    public static class TabPagerAdapter extends FragmentStatePagerAdapter {
        // Count number of tabs
        private int tabCount;

        public TabPagerAdapter(FragmentManager fm, int tabCount) {
            super(fm);
            this.tabCount = tabCount;
        }

        @Override
        public Fragment getItem(int position) {
            // Returning the current tabs
            // - tab 갯수 만큼 case문장도 동일해야 됨.  그렇지 않으면 [viewPager.setAdapter(pagerAdapter);]에서 오류 발생
            //   case비교값도 0,1,2,3... 와 같이 순차적이여야 함.
            // - 느낌이 [viewPager.setAdapter(pagerAdapter);]할때 getItem()메소드를 tabCount만큼 수행하는거 같음
            //   즉, Fragment 를 모두 만들어 놓음
            //   그런후, onTabSelected(TabLayout.Tab tab)  -> viewPager.setCurrentItem(tab.getPosition())를 하게 되면  화면이 변경 됨
            switch (position) {
                case 0:
                    TabFragment1 tabFragment1 = new TabFragment1();
                    return tabFragment1;
                case 1:
                    TabFragment2 tabFragment2 = new TabFragment2();
                    return tabFragment2;
                case 2:
                    TabFragment3 tabFragment3 = new TabFragment3();
                    return tabFragment3;
                default:
                    return null;
            }
        }

        @Override
        public int getCount() {
            return tabCount;
        }
    }
}


 

Posted by 농부지기
,