actionbar 를 이용하여 4개의 tab을 구현하였습니다. 그리고 하나의 tab안에서 검색버튼을 누르면 새로운 fragment 가 뜨면서 검색한 대상의 정보가 나옵니다. 여기서 에러가 납니다. 새로운 fragment 가 뜬 상태에서 다른 tab클릭시 앱이 죽어버립니다. Error : java.lang.IllegalArgumentException: No view found for id 0x7f070052 (org.jsb.busgod.busgod:id/pager) for fragment BusStop{42a68a00 #7 id=0x7f070052 BusStop} 라도 뜹니다.
MainActivity.class
public class MainActivity extends ActionBarActivity implements LineNumber.InfoListener
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Log.d(TAG,"MainActivity onCreate Called.");
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new TabViewPager()).commit();
}
@Override
public void searchInfo(String busRouteId,String busRouteNm, String routeType, String stStationNm, String edStationNm, String term, String lastBusTm, String firstBusTm) {
if(busRouteId.length() != 0 && busRouteNm.length() != 0 && routeType.length() != 0 && stStationNm.length() != 0 && edStationNm.length() != 0 && term.length() != 0 && lastBusTm.length() != 0 && firstBusTm.length() != 0) {
InfoFragment infoFragment = new InfoFragment();
/생략/
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.container, infoFragment);
ft.addToBackStack(null);
ft.commit();
} else {
Toast.makeText(MainActivity.this,"검색 결과가 없습니다.", Toast.LENGTH_SHORT).show();
}
}
activity_main.xml
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/container"
xmlns:android="http://schemas.android.com/apk/res/android">
</FrameLayout>
TabViewPager.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;
}
/생략/
//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();
/생략/
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.");
}
}
LineNumber.class
@Override
public void onAttach(Activity activity) {
this.activity = activity;
try {
mCallback = (InfoListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnHeadlineSelectedListener");
}
super.onAttach(activity);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Log.d(TAG, "LineNumber onCreateView() Called.");
View view = inflater.inflate(R.layout.linenumber,container,false);
LineSearch = (EditText) view.findViewById(R.id.lineSearch);
view.findViewById(R.id.lineSearchBtn).setOnClickListener(bHandler);
return view;
}
InfoFragment.class
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.info,container,false);
메인액티비티 setContent(activity_main.xml) -> TabViewPager -> TabViewPager 의 fragment중 LineNumber 검색버튼 클릭-> InfoFragment 해당 정보 보여 -> 다른 탭 클릭 앱 죽음
같은 container를 사용해서 죽는걸까요? 도와주세요 ㅠㅠ