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

액션바 탭 프래그먼트 사용시 에러 질문드립니다.

0 추천

Action Bar Tabs = TAB A , TAB B , TAB C , TAB D 로 메인화면이 구성되어 있습니다.

여기서 TAB B Search Button Click - > New Fragment 가 보여집니다.

다시 New Fragment 에서 기기 Back Button Click - > TAB B 화면이 보여집니다. 여기까지는 잘 됩니다.

근데 New Fragment 가 보여진 상태에서  TAB 클릭시 앱이 종료됩니다.

Error : No view found for id 0x7f070053 (org.jsb.busgod.busgod:id/pager) for fragment BusStop{412d49c0 #7 id=0x7f070053 BusStop}

TabPager.class

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


        Log.d(TAG,"TabViewPager onCreate Called.");

    if(view == null) {
        view = inflater.inflate(R.layout.tabpager,container,false);
        mActionBar = ((ActionBarActivity) activity).getSupportActionBar();
        mActionBar.setIcon(new ColorDrawable(Color.TRANSPARENT));
        mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        mActionBar.setDisplayShowTitleEnabled(true);

        mTabPagerAdapter = new ActionBarTabPagerAdapter(((ActionBarActivity) activity).getSupportFragmentManager());
        mPager = (ViewPager) view.findViewById(R.id.pager);
        mPager.setAdapter(mTabPagerAdapter);

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

    } else {
        ((ViewGroup)view.getParent()).removeView(view);
    }

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

        return view;
    }

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

        outState.putInt("tab", ((ActionBarActivity) activity).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 = ((ActionBarActivity)activity).getSupportFragmentManager();
            mFragment = fm.findFragmentByTag(mTag);

            if(mFragment != null && !mFragment.isDetached()){
                FragmentTransaction ft = ((ActionBarActivity)activity).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.pager,mFragment,mTag);

            }else{
                fragmentTransaction.attach(mFragment);
            }
            mPager.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.");
        }
    }

 

우랴 (3,680 포인트) 님이 2014년 6월 3일 질문

답변 달기

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