2013-07-22 3 views
0

TabActivity 및 fragments 및 viewPager와 같은 탭을 구현하는 일반적인 방법으로 일주일 동안 고생하고 나면 활동 또는 탭 조각을 얻지 못하고 문제를 해결할 방법을 찾지 못했습니다. 그래서 저는 그것을 다른 방식으로 구현하기로 결정했습니다. 먼저 간단한 버튼으로 tabWidget을 만든다. 안드로이드 개발자 웹 사이트에서 나는 런타임에 fragment를 대체 할 방법을 찾는다. 그래서 유일한 단점은 탭 조각에 접근하여 FragmentActivity에서 메소드를 호출하는 것입니다.간단한보기 및 단편으로 탭을 구현하는 방법

여기는 pageViewer를 사용한 나의 FragmentActivity입니다.

public class MainActivity extends FragmentActivity implements 
    OnTabChangeListener, OnPageChangeListener { 
    private TabHost mTabHost; 
private ViewPager mViewPager; 
private HashMap<String, TabInfo> mapTabInfo = new HashMap<String, MainActivity.TabInfo>(); 
private PagerAdapter mPagerAdapter; 
private TabInfo mLastTab = null; 

private class TabInfo { 
    private String tag; 
    private Class clss; 
    private Bundle args; 
    private Fragment fragment; 

    TabInfo(String tag, Class clazz, Bundle args) { 
     this.tag = tag; 
     this.clss = clazz; 
     this.args = args; 
    } 

} 

class TabFactory implements TabContentFactory { 

    private final Context mContext; 

    /** 
    * @param context 
    */ 
    public TabFactory(Context context) { 
     mContext = context; 
    } 

    /** 
    * (non-Javadoc) 
    * 
    * @see android.widget.TabHost.TabContentFactory#createTabContent(java.lang.String) 
    */ 
    public View createTabContent(String tag) { 
     View v = new View(mContext); 
     v.setMinimumWidth(0); 
     v.setMinimumHeight(0); 
     return v; 
    } 

} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    Log.d("checking", "setup tabs..."); 
    setContentView(R.layout.activity_main); 
    // // 
    initialiseTabHost(savedInstanceState); 
    if (savedInstanceState != null) { 
     mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab")); 
    } 
    intialiseViewPager(); 
    // // 
    setup(); 
    // /// 
} 

protected void onSaveInstanceState(Bundle outState) { 
    outState.putString("tab", mTabHost.getCurrentTabTag()); // save the tab 
                  // selected 
    super.onSaveInstanceState(outState); 
} 

private void intialiseViewPager() { 

    List<Fragment> fragments = new Vector<Fragment>(); 
    fragments 
      .add(Fragment.instantiate(this, CoachFragment.class.getName())); 
    fragments 
      .add(Fragment.instantiate(this, LogingFragment.class.getName())); 
    fragments.add(Fragment.instantiate(this, 
      HistoryFragment.class.getName())); 
    this.mPagerAdapter = new PagerAdapter(
      super.getSupportFragmentManager(), fragments); 
    // 
    this.mViewPager = (ViewPager) super.findViewById(R.id.viewpager); 
    this.mViewPager.setAdapter(this.mPagerAdapter); 
    this.mViewPager.setOnPageChangeListener(this); 
    mViewPager.setOffscreenPageLimit(1000000); 
} 

private void initialiseTabHost(Bundle args) { 
    mTabHost = (TabHost) findViewById(android.R.id.tabhost); 
    mTabHost.setup(); 
    mTabHost.getTabWidget().setDividerDrawable(R.drawable.tab_divider); 
    TabInfo tabInfo = null; 
    View tabView1 = createTabView(this, coach"); 
    MainActivity.AddTab(this, this.mTabHost, this.mTabHost 
      .newTabSpec("Tab1").setIndicator(tabView1), 
      (tabInfo = new TabInfo("Tab1", CoachFragment.class, args))); 
    this.mapTabInfo.put(tabInfo.tag, tabInfo); 
    View tabView2 = createTabView(this, logbook"); 
    MainActivity.AddTab(this, this.mTabHost, this.mTabHost 
      .newTabSpec("Tab2").setIndicator(tabView2), 
      (tabInfo = new TabInfo("Tab2", LogingFragment.class, args))); 
    this.mapTabInfo.put(tabInfo.tag, tabInfo); 
    View tabView3 = createTabView(this, "history"); 
    MainActivity.AddTab(this, this.mTabHost, this.mTabHost 
      .newTabSpec("Tab3").setIndicator(tabView3), 
      (tabInfo = new TabInfo("Tab3", HistoryFragment.class, args))); 
    this.mapTabInfo.put(tabInfo.tag, tabInfo); 
    mTabHost.setOnTabChangedListener(this); 
} 

private static void AddTab(MainActivity activity, TabHost tabHost, 
     TabHost.TabSpec tabSpec, TabInfo tabInfo) { 
    // Attach a Tab view factory to the spec 
    tabSpec.setContent(activity.new TabFactory(activity)); 
    tabHost.addTab(tabSpec); 
} 

public void setup() { 
    .... 
         CoachFragment fragment=(CoachFragment) mPagerAdapter.getRegisteredFragment(mViewPager.getCurrentItem()); 
         fragment.setTempView(R.id.welcome); 
         fragment.animate(); 
        .... 
} 

public void onTabChanged(String tag) { 
    // TabInfo newTab = this.mapTabInfo.get(tag); 
    int pos = this.mTabHost.getCurrentTab(); 
    this.mViewPager.setCurrentItem(pos); 
} 

private static View createTabView(final Context context, final String text) { 
    View view = LayoutInflater.from(context) 
      .inflate(R.layout.tabs_bg, null); 
    TextView tv = (TextView) view.findViewById(R.id.tabsText); 
    tv.setText(text); 
    return view; 
} 


@Override 
public void onPageScrollStateChanged(int arg0) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onPageScrolled(int arg0, float arg1, int arg2) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onPageSelected(int position) { 
    // TODO Auto-generated method stub 
    this.mTabHost.setCurrentTab(position); 
} 

}

내 pageAdapter :

public class PagerAdapter extends FragmentPagerAdapter { 

private List<Fragment> fragments; 
private HashMap<Integer, Fragment> registeredFragments=new HashMap<Integer, Fragment>(); 
/** 
* @param fm 
* @param fragments 
*/ 
public PagerAdapter(FragmentManager fm, List<Fragment> fragments) { 
    super(fm); 
    this.fragments = fragments; 
} 
/* (non-Javadoc) 
* @see android.support.v4.app.FragmentPagerAdapter#getItem(int) 
*/ 
@Override 
public Fragment getItem(int position) { 
    return this.fragments.get(position); 
} 


@Override 
public Object instantiateItem(ViewGroup container, int position) { 
    Fragment fragment = (Fragment) super.instantiateItem(container, position); 
    registeredFragments.put(position, fragment); 
    return fragment; 
} 

@Override 
public void destroyItem(ViewGroup container, int position, Object object) { 
    registeredFragments.remove(position); 
    super.destroyItem(container, position, object); 
} 


public Fragment getRegisteredFragment(int position) { 
    return registeredFragments.get(position); 
} 

/* (non-Javadoc) 
* @see android.support.v4.view.PagerAdapter#getCount() 
*/ 
@Override 
public int getCount() { 
    return this.fragments.size(); 
} 

}

내 LogingFragment을 내가 setup() 방법에 내 탭의 조각 객체를 취득 할 때 나는 nullpointer를 얻을. 다른 2 개 조각은 동일 하나 :

public class LogingFragment extends Fragment{ 

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    if (container == null) { 
     // We have different layouts, and in one of them this 
     // fragment's containing frame doesn't exist. The fragment 
     // may still be created from its saved state, but there is 
     // no reason to try to create its view hierarchy because it 
     // won't be displayed. Note this is not needed -- we could 
     // just run the code below, where we would create and return 
     // the view hierarchy; it would just never be used. 
     return null; 
    } 
    return (LinearLayout)inflater.inflate(R.layout.coach_activity, container, false); 
} 

}

모든 것을 완벽하게 작동하고 모든보고 스 와이프는 잘하지만 설정에서 작동() 메소드 나는 nullPointer를 얻을. 그걸로 나를 도와주세요.

답변

1

http://developer.android.com/training/implementing-navigation/index.html 마지막으로 내가 nullpointer의 원인이 무엇인지를 파악 탭 및 ViewPager

를 사용하는 샘플 효과적인 탐색을 테스트하는 것이 좋습니다. 호출기 어댑터는 다음과 같이해야합니다 :

public class PagerAdapter extends FragmentPagerAdapter { 

Fragment screens[]; 
public PagerAdapter(FragmentManager fm, MainActivity context) { 
    super(fm); 
    screens = new Fragment[3]; 
    screens[0] = Fragment.instantiate(context,CoachFragment.class.getName()); 
    screens[1] = Fragment.instantiate(context,LogingFragment.class.getName()); 
    screens[2] = Fragment.instantiate(context,HistoryFragment.class.getName()); 
} 

@Override 
public Fragment getItem(int index) { 
    if(index <= screens.length) 
    { 
     return screens[index]; 
    } 
    return null; 
} 

@Override 
public int getCount() { 
    return screens.length; 
} 

}

때문에 인스턴스보기 호출기 변경 아래와 같이 :

private void intialiseViewPager() { 


    this.mPagerAdapter = new PagerAdapter(super.getSupportFragmentManager(),this); 
    // 
    this.mViewPager = (ViewPager) super.findViewById(R.id.viewpager); 
    this.mViewPager.setAdapter(this.mPagerAdapter); 
    this.mViewPager.setOnPageChangeListener(this); 
    // 
    this.mViewPager = (ViewPager) super.findViewById(R.id.viewpager); 
    this.mViewPager.setAdapter(this.mPagerAdapter); 
    this.mViewPager.setOnPageChangeListener(this); 
} 

감사 @Bruno 마테우스가

0
당신이 안드로이드를 처음처럼이 날 것으로 보인다

은, 내가 올바른 방향을 제시해주기 때문에하자 (당신은 안드로이드에 새로운없는 경우, 내 사과) :

당신은 앱에서 탭을 사용하려면 , 가장 최신의 방법은 Action Bar tabs을 사용하는 것입니다.

이 경우에만 menu.xml 파일을 편집하고 onCreateOptionsMenu() 메소드를 주 활동에 추가해야합니다. 또한

는 귀하의 질문에,

그래서 유일하게 남아 대답하는 것은 당신이 당신의 조각을 사용해서는 안

내 FragmentActivity에서 메소드를 호출 탭 조각에 접근하는 방법 프래그먼트 작업에서 메소드를 호출합니다.

다시 말하지만,이 비디오와 함께 올바른 방향으로 알려 드리겠습니다. "Programming Android with fragments". 조금 길지만 조각을 사용하는 방법을 설명합니다.

동영상 조각 예제를 사용하고 작업 표시 줄 탭 페이지의 예제 코드와 결합하십시오.

행운을 빕니다

** 빠른 편집 명확히하기 : 그 탭을 사용하여 최신 쉬운 방법이기 때문에 당신은 작업 표시 줄 탭을 사용합니다. 새로운 '우수 사례'입니다. TabWidget과 TabActivity는 더 오래되었고, 더 복잡하며, 내가 아는 모든 것에 대해 더 이상 사용되지 않을 수도 있습니다.

+0

API 레벨 10을 사용하고 있으므로 ActionBar 탭을 사용할 수 없다고 생각합니다. –

+0

그런 경우에는 액션 바 셜록 사용을 진지하게 고려해보십시오. – IanB

+0

@Mohamad Ghadourian ^^ 예, 깜빡했습니다. 액션 바 셜록은 낮은 API 레벨을위한 액션 바를 지원합니다. – scottyseus

1

난 강력하게 실행하고

+0

살람 모센. 귀하의 답변에 감사드립니다. PageViewer를 사용하여 내 탭을 완전히 구현했습니다. 내 문제는 내가 조각 탭 레이아웃을 변경하고 싶을 때 나는 내 탭의 조각 객체가 필요하지만 모든 접근법에서 null을 얻는다는 것이다. 나는 전체 활동과 파편을 게시 할 것이다. PLZ 내 문제가 정확히 어디 있는지 보여주세요. 대단히 고마워 ... –

0

GrilledUI 라이브러리를 시도합니다. 그것은 당신을 위해 모든 더러운 일을 할 것이며 심지어 XML에서 탭 목록을로드합니다.

관련 문제