1

캘린더 응용 프로그램에서 ActionBarSherlock을 사용하여 1) 캘린더 2) 변환기 탭을 표시합니다. ActionBar 메뉴 항목의 click 이벤트에서 그 달의 이벤트 요약을 표시하려면 SlidingMenu 서랍을 사용하고 있습니다.ViewPager 및 ActionBarSherlock 탭이있는 SlidingMenu

나는 달력 탭을 위해 특별히 viewpager 사용하려는 나는 이런 식으로 구현 한 :

Main.java :

public class BaseActivity extends SlidingSherlockFragmentActivity 
{ 

    private ViewPager pager; 
    CalendarFragmentPagerAdapter mPagerAdapter; 
    private static final int MONTHS_LIMIT = 5; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setTitle(R.string.app_name); 

     setContentView(R.layout.main); 
     getSupportFragmentManager() 
     .beginTransaction() 
     .replace(R.id.main, new CalendarFragment()) 
     .commit(); 

     setBehindContentView(R.layout.content_frame); 
     getSupportFragmentManager() 
     .beginTransaction() 
     .replace(R.id.content_frame, new EventsSummary()) 
     .commit(); 

     setSlidingActionBarEnabled(false); 

     final ActionBar bar = getSupportActionBar(); 
     bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
     bar.setHomeButtonEnabled(true); 

     ActionBar.Tab calendar = bar.newTab(); 
     ActionBar.Tab converter = bar.newTab(); 

     calendar.setText(this.getResources().getString(R.string.calendar)); 
     converter.setText(this.getResources().getString(R.string.converter)); 

     calendar.setTabListener(new MyTabListener()); 
     converter.setTabListener(new MyTabListener()); 

     bar.addTab(calendar); 
     bar.addTab(converter); 

     // customize the SlidingMenu 
     SlidingMenu sm = getSlidingMenu(); 
     sm.setShadowWidthRes(R.dimen.shadow_width); 
     sm.setShadowDrawable(R.drawable.shadow); 
     sm.setBehindOffsetRes(R.dimen.actionbar_home_width); 
     sm.setSlidingEnabled(false); 

     mPagerAdapter = new CalendarFragmentPagerAdapter(getSupportFragmentManager()); 
     pager = (ViewPager) this.findViewById(R.id.viewpager); 
     pager.setAdapter(mPagerAdapter); 
     pager.setCurrentItem(MONTHS_LIMIT/2); 


    } 


    private class MyTabListener implements ActionBar.TabListener 
    { 

     @Override 
     public void onTabSelected(Tab tab, FragmentTransaction ft) { 
      if(tab.getPosition()==0) 
      { 
       CalendarFragment frag = new CalendarFragment(); 
       ft.replace(R.id.main, frag); 
      } 
      else 
      { 
       ConverterFragment frag = new ConverterFragment(); 
       ft.replace(R.id.main, frag); 
      } 
     } 
     @Override 
     public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
      // TODO Auto-generated method stub 
     } 
     @Override 
     public void onTabReselected(Tab tab, FragmentTransaction ft) { 
      // TODO Auto-generated method stub 
     } 
    } 

    public boolean onOptionsItemSelected(MenuItem item) { 
     Intent newActivity; 
     // Handle item selection 
     switch (item.getItemId()) { 
      case R.id.menu_slidingmenu: 
       toggle(); 
       return true; 

      default: 
       return super.onOptionsItemSelected(item); 
     } 
    } 



    public class CalendarFragmentPagerAdapter extends FragmentPagerAdapter { 

     public CalendarFragmentPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      CalendarFragment fragment = new CalendarFragment(); 
      Bundle args = new Bundle(); 
      args.putInt("offset", position - MONTHS_LIMIT/2); 
      fragment.setArguments(args); 
      return fragment; 
     } 

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

    } 
} 

CalendarFragment.java :

public class CalendarFragment extends Fragment 
{ 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      Bundle args = getArguments(); 
      int offset = args.getInt("offset"); //throws NullPointerException 
     } 

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

      View v = inflater.inflate(R.layout.simple_calendar_view, container, false); 

      ..... 

      return v; 
     } 

     @Override 
     public void onSaveInstanceState(Bundle outState) { 
      super.onSaveInstanceState(outState); 
      outState.putBoolean("dummy", true); 
     } 


} 

CalendarFragment의이 줄에 문제가 있습니다 :

int offset = args.getInt("offset"); 

오류 NullPointerException이 발생하고 디버그에 이것이 표시되는 이유는 Bundle args = getArguments()이 null이기 때문입니다.

은 내가 PagerAdapter이 줄에 중단 점을 넣어 시도 :

Bundle args = new Bundle(); 

하지만 결코 여기에 도달하지 및 응용 프로그램이 충돌이 NullPointerException를 던지고.

어디로 잘못 가고 있습니까?

getSupportFragmentManager() 
     .beginTransaction() 
     .replace(R.id.main, new CalendarFragment()) 
     .commit(); 

여기

답변

0

여기

@Override 
public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    if (tab.getPosition() == 0) { 
     CalendarFragment frag = new CalendarFragment(); 
     ft.replace(R.id.main, frag); 
    } else { 
     ConverterFragment frag = new ConverterFragment(); 
     ft.replace(R.id.main, frag); 
    } 
} 

당신은 인수없이 빈 CalendarFragment의 인스턴스를 생성하고 있습니다.

따라서 활동을 시작하고 인수가없는 빈 단편을 만든 다음 그걸 가져 오려고하면 충돌합니다.

+0

지적 해 주셔서 감사합니다. 어떻게해야 FragmentPagerAdapter가 다시 대체되지 않고 CalendarFragment로 매개 변수를 전달하는지 어떻게 확인할 수 있습니까? – input