마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

actionbar를 이용해서 tab과 viewpager를 구현중 질문드립니다.

0 추천
 
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;


public class MainActivity extends ActionBarActivity {
    private static final String TAG = "MainActivity";
    private ActionBar mActionBar;
    private TextView title;
    private ActionBarTabPagerAdapter mTabPagerAdapter;
    private ViewPager mViewPager;

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

        mActionBar = getSupportActionBar();
        mActionBar.setIcon(new ColorDrawable(Color.TRANSPARENT));
        mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        mActionBar.setDisplayShowTitleEnabled(true);

        //ViewPager
        mTabPagerAdapter = new ActionBarTabPagerAdapter(getSupportFragmentManager());
        mViewPager = (ViewPager) findViewById(R.id.main);
        mViewPager.setAdapter(mTabPagerAdapter);

        mViewPager.setOnPageChangeListener(new PagerListener());

        // 1
        ActionBar.Tab bmTab = mActionBar.newTab();
        bmTab.setText("즐겨찾기");
        bmTab.setTabListener(new TabListener<BookMark>(MainActivity.this,"BookMark",BookMark.class));
        mActionBar.addTab(bmTab);
        //2
        ActionBar.Tab lnTab = mActionBar.newTab();
        lnTab.setText("노선번호");
        lnTab.setTabListener(new TabListener<LineNumber>(MainActivity.this,"LineNumber",LineNumber.class));
        mActionBar.addTab(lnTab);
        //3
        ActionBar.Tab bsTab = mActionBar.newTab();
        bsTab.setText("정류소");
        bsTab.setTabListener(new TabListener<BusStop>(MainActivity.this,"BusStop",BusStop.class));
        mActionBar.addTab(bsTab);
        //4
        ActionBar.Tab nbsTab = mActionBar.newTab();
        nbsTab.setText("주변정류소");
        nbsTab.setTabListener(new TabListener<NearbyBusStop>(MainActivity.this,"NearbyBusStop",NearbyBusStop.class));
        mActionBar.addTab(nbsTab);



        if(savedInstanceState != null){
            mActionBar.setSelectedNavigationItem(savedInstanceState.getInt("tab",0));
        }

    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        outState.putInt("tab",getSupportActionBar().getSelectedNavigationIndex());


    }

    //PagerListener
    private class PagerListener extends ViewPager.SimpleOnPageChangeListener{
        @Override
        public void onPageSelected(int position) {
            super.onPageSelected(position);
            mActionBar.setSelectedNavigationItem(position);
        }
    }


    //TabListener
    private class TabListener <T> implements ActionBar.TabListener{
        private Activity mActivity;
        private String mTag;
        private Class<T> mClass;
        private Bundle mBundle;
        private Fragment mFragment;

        public TabListener(Activity mActivity, String mTag, Class<T> mClass){
            this(mActivity,mTag,mClass,null);
        }

        public TabListener(Activity mActivity,String mTag, Class<T> mClass, Bundle mBundle){
            super();
            this.mActivity = mActivity;
            this.mTag = mTag;
            this.mClass = mClass;
            this.mBundle = mBundle;

            FragmentManager fm = getSupportFragmentManager();
            mFragment = fm.findFragmentByTag(mTag);

            if(mFragment != null && !mFragment.isDetached()){
                FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
                ft.detach(mFragment);
                ft.commit();
            }
        }
        @Override
        public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
            Log.d(TAG,"onTabSelected() Called.");
            int position = tab.getPosition();

            switch (position){
                case 0:
                    mActionBar.setTitle("즐겨찾기");
                    break;
                case 1:
                    mActionBar.setTitle("노선번호");
                    break;
                case 2:
                    mActionBar.setTitle("정류소");
                    break;
                case 3:
                    mActionBar.setTitle("주변정류소");
                    break;
            }
                if(mFragment == null){
                    mFragment = Fragment.instantiate(mActivity,mClass.getName(),mBundle);
                    fragmentTransaction.add(R.id.main,mFragment,mTag);

                }else{
                    fragmentTransaction.attach(mFragment);
                }
                mViewPager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
            Log.d(TAG,"onTabUnselected() Called.");
            if(mFragment != null){
                fragmentTransaction.detach(mFragment);
                mFragment = null;
            }
        }
        @Override
        public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
            Log.d(TAG,"onTabReselected() Called.");
            Toast.makeText(mActivity, "ReSelected!!!", Toast.LENGTH_SHORT).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.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.

        switch (item.getItemId()){
            case R.id.action_settings:
                Toast.makeText(MainActivity.this,"설정이 눌렸습니다.",Toast.LENGTH_SHORT).show();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}
코드는 이렇게 되어 있습니다. 질문은 viewpager 방식으로 화면을 이동 하면 tabListener 의 onTabSelected() 가 호출됩니다.
그리고 Tab 방식으로 화면을 이동할때는 onTabReselected() 가 호출됩니다. 즉, Tab 방식으로 화면을 이동할때 onTabUnselected()
-> onTabSelected() -> onTabReselected() 가 동시에 이루어집니다. 여기서 해결하고싶은 문제는 Tab방식으로 이동할때 onTabReselected()가 호출이 안되게끔 하고 싶습니다. 부탁드리겠습니다. ㅠ_ㅠ
우랴 (3,680 포인트) 님이 2014년 5월 23일 질문

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...