2012-02-26 2 views
4

아래 코드를 참조하십시오 (https://gist.github.com/1126843에서 가져옴) 어떻게 탭 내용을 설정합니까? 코드에서탭 내용을 사용하여 액션 바를 사용합니다. 탭 스타일

public class NativeTabActivity extends Activity { 
    private TabHost mTabHost; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     mTabHost = (TabHost)findViewById(android.R.id.tabhost); 
     mTabHost.setup(); 

     addTab(new TextView(this), "Tab 1"); 
     addTab(new TextView(this), "Tab 2"); 
     addTab(new TextView(this), "Tab 3"); 
    } 

    private void addTab(final View content, final String title) { 
     View tabView = LayoutInflater.from(this).inflate(R.layout.abs__action_bar_tab_layout, null); 
     TextView tv = (TextView) tabView.findViewById(R.id.abs__tab); 
     tv.setText(title); 

     TabSpec setContent = mTabHost.newTabSpec(title).setIndicator(tabView).setContent(new TabContentFactory() { 
      public View createTabContent(String tag) { 
       return content; 
      } 
     }); 
     mTabHost.addTab(setContent); 
    } 
} 

은, 내가보기 createTabContent (문자열 태그) 아래 내용을 넣어하지만 난 그것을 어떻게해야합니까해야 할 것 같다?

답변

8

필자는 Sherlock 구현을 위해 Fragments를 사용합니다. 탭에 다른 조각을로드

public class ActionBarTabs extends FragmentActivity { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    ActionBar bar = getSupportActionBar(); 
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
    bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE); 

    bar.addTab(bar.newTab() 
      .setText("Home") 
      .setTabListener(new TabListener<DashBoardFragment>(
        this, "home", DashBoardFragment.class, null))); 

    bar.addTab(bar.newTab() 
      .setText("Inventory") 
      .setTabListener(new TabListener<InventoryFragment>(
        this, "inventory", InventoryFragment.class, null))); 

if (savedInstanceState != null) { 

     bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0)); 
    } 


} 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case android.R.id.home: 
      // app icon in action bar clicked; go Location selection 
      Intent intent = new Intent(ActionBarTabs.this, LocationSelectorActivity.class); 
      ActionBarTabs.this.startActivityForResult(intent,0); 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
    } 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putInt("tab", getSupportActionBar().getSelectedNavigationIndex()); 
} 

public class TabListener<T extends Fragment> implements ActionBar.TabListener { 
    private final FragmentActivity mActivity; 
    private final String mTag; 
    private final Class<T> mClass; 
    private final Bundle mArgs; 
    private Fragment mFragment; 




    public TabListener(FragmentActivity activity, String tag, Class<T> clz, Bundle args) { 
     mActivity = activity; 
     mTag = tag; 
     mClass = clz; 
     mArgs = args; 
     FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction(); 


     // Check to see if we already have a fragment for this tab, probably 
     // from a previously saved state. If so, deactivate it, because our 
     // initial state is that a tab isn't shown. 
     mFragment = mActivity.getSupportFragmentManager().findFragmentByTag(mTag); 
     if (mFragment != null && !mFragment.isDetached()) { 
      ft.detach(mFragment); 
     } 
    } 

    @Override 
    public void onTabSelected(Tab tab) { 
     FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction(); 

     if (mFragment == null) { 
      mFragment = Fragment.instantiate(mActivity, mClass.getName(), mArgs); 
      ft.add(android.R.id.content, mFragment, mTag); 
      ft.commit(); 
     } else { 
      ft.attach(mFragment); 
      ft.commit(); 
     } 
    } 

    @Override 
    public void onTabUnselected(Tab tab) { 
     FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction(); 

     if (mFragment != null) { 
      ft.detach(mFragment); 
      ft.commitAllowingStateLoss(); 
     }   
    } 

    @Override 
    public void onTabReselected(Tab tab) { 

    } 

} 

} 

중요한 변화는 단순히 이러한 라인에 조각 클래스의 이름으로 "YOUR_FRAGMENT_NAME"를 변경하는 것입니다 :이 도움이

bar.addTab(bar.newTab() 
      .setText("Home") 
      .setTabListener(new TabListener<YOUR_FRAGMENT_NAME>(
        this, "home", YOUR_FRAGMENT_NAME.class, null))); 

희망!

14

나는 Rymnel의 대답이 매우 유용하다는 것을 알았지 만, ActionBarSherlock 4.0에서 제대로 작동하려면 약간의 수정을해야했습니다. FragmentTransactions에서 전달하는 onTab 메서드를 재정의하는 데 문제가있어서 기본 메서드를 사용하고 메서드 내에서 "ft"var을 다시 할당했습니다. 이것을 할 수있는 더 깨끗한 방법이 있다고 확신하지만, 여기에 제 작업 코드가 있습니다 :

public class TabTestActivity extends SherlockFragmentActivity { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    ActionBar bar = getSupportActionBar(); 
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
    bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE); 
    bar.setDisplayHomeAsUpEnabled(true); 
    bar.setDisplayShowTitleEnabled(true); 
    bar.setTitle("Activity Title"); 
    bar.addTab(bar 
      .newTab() 
      .setText("Tab 1") 
      .setTabListener(
        new TabListener<TabTest1>(this, "tab1", 
          TabTest1.class, null))); 

    bar.addTab(bar 
      .newTab() 
      .setText("Tab 2") 
      .setTabListener(
        new TabListener<TabTest2>(this, "tab2", 
          TabTest2.class, null))); 
    bar.addTab(bar 
      .newTab() 
      .setText("Tab 3") 
      .setTabListener(new TabListener<TabTest3>(this, "tab3", TabTest3.class, null))); 

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

} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case android.R.id.home: 
     // app icon in action bar clicked; go home 
        Intent intent = new Intent(this, DashboardActivity.class); 
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
        startActivity(intent); 
        return true; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putInt("tab", getSupportActionBar() 
      .getSelectedNavigationIndex()); 
} 

public class TabListener<T extends Fragment> implements 
     ActionBar.TabListener { 
    private final FragmentActivity mActivity; 
    private final String mTag; 
    private final Class<T> mClass; 
    private final Bundle mArgs; 
    private Fragment mFragment; 

    public TabListener(FragmentActivity activity, String tag, Class<T> clz, 
      Bundle args) { 
     mActivity = activity; 
     mTag = tag; 
     mClass = clz; 
     mArgs = args; 
     FragmentTransaction ft = mActivity.getSupportFragmentManager() 
       .beginTransaction(); 

     // Check to see if we already have a fragment for this tab, probably 
     // from a previously saved state. If so, deactivate it, because our 
     // initial state is that a tab isn't shown. 
     mFragment = mActivity.getSupportFragmentManager() 
       .findFragmentByTag(mTag); 
     if (mFragment != null && !mFragment.isDetached()) { 
      ft.detach(mFragment); 
     } 
    } 


    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     ft = mActivity.getSupportFragmentManager() 
       .beginTransaction(); 

     if (mFragment == null) { 
      mFragment = Fragment.instantiate(mActivity, mClass.getName(), 
        mArgs); 
      ft.add(android.R.id.content, mFragment, mTag); 
      ft.commit(); 
     } else { 
      ft.attach(mFragment); 
      ft.commit(); 
     } 

    } 

    @Override 
    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     ft = mActivity.getSupportFragmentManager() 
       .beginTransaction(); 

     if (mFragment != null) { 
      ft.detach(mFragment); 
      ft.commitAllowingStateLoss(); 
     } 

    } 

    @Override 
    public void onTabReselected(Tab tab, FragmentTransaction ft) { 
    } 
} 
관련 문제