如何添加tabhost导航抽屉? [英] How to add tabhost with navigation drawer?

查看:147
本文介绍了如何添加tabhost导航抽屉?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是新android开发,我的导航抽屉从此的 http://www.androidhive.info/2013/11/android-sliding-menu-using-navigation-drawer/

现在我想补充Tabhost与it..can谁能帮我呢? 以下是我的code我tried..I不知道这是不是说明为什么。

 公共类MainActivity扩展FragmentActivity {
      私人DrawerLayout mDrawerLayout;
      私人的ListView mDrawerList;
      私人ActionBarDrawerToggle mDrawerToggle;

     //导航抽屉称号
      私人的CharSequence mDrawerTitle;

    //用于存储应用程序标题
     私人的CharSequence mTitle;

     //滑动菜单项

     私有String [] navMenuTitles;
     私人TypedArray navMenuIcons;

     私人的ArrayList< NavDrawerItem> navDrawerItems;
     私人NavDrawerListAdapter适配器;

     @覆盖
     保护无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);

        mTitle = mDrawerTitle =的getTitle();

        //负荷滑动菜单项
        navMenuTitles = getResources()getStringArray(R.array.nav_drawer_items)。

        //导航抽屉,从资源的图标
        navMenuIcons = getResources()
                .obtainTypedArray(R.array.nav_drawer_icons);

        mDrawerLayout =(DrawerLayout)findViewById(R.id.drawer_layout);
        mDrawerList =(ListView控件)findViewById(R.id.list_slidermenu);

        navDrawerItems =新的ArrayList< NavDrawerItem>();
        //添加导航抽屉里的物品数组
        // 家
        navDrawerItems.add(新NavDrawerItem(navMenuTitles [0],navMenuIcons
                .getResourceId(0,-1)));
        //查找人​​员
        navDrawerItems.add(新NavDrawerItem(navMenuTitles [1],navMenuIcons
                .getResourceId(1,-1)));
        //照片
        navDrawerItems.add(新NavDrawerItem(navMenuTitles [2],navMenuIcons
                .getResourceId(2,-1)));
        //社区,这里将添加计数器
        navDrawerItems.add(新NavDrawerItem(navMenuTitles [3],navMenuIcons
                .getResourceId(3,-1)));
        //网页
        navDrawerItems.add(新NavDrawerItem(navMenuTitles [4],navMenuIcons
                .getResourceId(4,-1)));
        //热点,我们将在这里添加计数器
        navDrawerItems.add(新NavDrawerItem(navMenuTitles [5],navMenuIcons
                .getResourceId(5,-1)));

        //回收类型数组
        navMenuIcons.recycle();

        mDrawerList.setOnItemClickListener(新SlideMenuClickListener());

        //设置导航抽屉名单适配器
        适配器=新NavDrawerListAdapter(getApplicationContext()
                navDrawerItems);
        mDrawerList.setAdapter(适配器);

        //使操作栏中的应用程序图标,它表现为切换按钮
        getActionBar()setDisplayHomeAsUpEnabled(假)。
        getActionBar()setHomeButtonEnabled(真)。

        mDrawerToggle =新ActionBarDrawerToggle(这一点,mDrawerLayout,
                R.drawable.ic_drawer,//导航菜单切换图标
                R.string.app_name,//导航抽屉打开 - 说明
                                    //访问
                R.string.app_name //导航抽屉关闭 - 说明
                                    //访问
        ){
            公共无效onDrawerClosed(查看视图){
                。getActionBar()的setTitle(mTitle);
                //调用prepareOptionsMenu()来显示操作栏图标
                getActionBar()的setIcon(R.drawable.ic_drawer)。
                invalidateOptionsMenu();
            }

            公共无效onDrawerOpened(查看drawerView){
                。getActionBar()的setTitle(mDrawerTitle);
                //调用prepareOptionsMenu()隐藏操作栏图标
                getActionBar()的setIcon(R.drawable.ic_drawer)。
                invalidateOptionsMenu();
            }
        };
        mDrawerLayout.setDrawerListener(mDrawerToggle);

        如果(savedInstanceState == NULL){
            //关于第一导航项目首次显示视图
            displayView(0);
        }
    }

私有类SlideMenuClickListener工具
        ListView.OnItemClickListener {
    @覆盖
    公共无效onItemClick(适配器视图<>母公司视图中查看,INT位置,
            长ID){
        对选定的导航抽屉的项目//显示视图
        displayView(位置);
    }
}

@覆盖
公共布尔onCreateOptionsMenu(功能菜单){
    。getMenuInflater()膨胀(R.menu.main,菜单);
    返回true;
}

@覆盖
公共布尔onOptionsItemSelected(菜单项项){
    //切换导航抽屉选择操作栏中的应用程序图标/标题
    如果(mDrawerToggle.onOptionsItemSelected(项目)){
        返回true;
    }
    //手柄操作栏操作点击
    开关(item.getItemId()){
    案例R.id.action_settings:
        返回true;

    默认:
        返回super.onOptionsItemSelected(项目);
    }
}

/ * *
 *当调用invalidateOptionsMenu()被触发
 * /
@覆盖
公共布尔prepareOptionsMenu(功能菜单)在{
    //如果导航抽屉被打开,隐藏行动项目
    布尔drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
    menu.findItem(R.id.action_settings).setVisible(drawerOpen!);
    返回super.on prepareOptionsMenu(菜单);
}

/ **
 * Diplaying片段视图选择导航抽屉列表项
 * * /
私人无效displayView(INT位置){
    //更新替换片段的主要内容
    片段片段= NULL;
    开关(位置){
    情况下0:
        片段=新HomeFragment();
        打破;
   /* 情况1:
        片段=新FindPeopleFragment();
        打破;
    案例2:
        片段=新PhotosFragment();
        打破;
    案例3:
        片段=新CommunityFragment();
        打破;
    壳体4:
        片段=新PagesFragment();
        打破;
    壳体5:
        片段=新WhatsHotFragment();
        打破;
    * /
    默认:
        打破;
    }

    如果(片段!= NULL){
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction()
                .replace(R.id.frame_container,片段).commit();

        //更新所选项目和标题,然后关上抽屉
        mDrawerList.setItemChecked(位置,真正的);
        mDrawerList.setSelection(位置);
        的setTitle(navMenuTitles [位置]);
        mDrawerLayout.closeDrawer(mDrawerList);
    } 其他 {
        //创建片段错误
        Log.e(MainActivity,创建片段错误);
    }
}

@覆盖
公共无效的setTitle(CharSequence的标题){
    mTitle =称号;
    。getActionBar()的setTitle(mTitle);
}

/ **
 *当使用ActionBarDrawerToggle,你必须在调用它
 * onPostCreate()和onConfigurationChanged()...
 * /

@覆盖
保护无效onPostCreate(包savedInstanceState){
    super.onPostCreate(savedInstanceState);
    //同步发生onRestoreInstanceState后切换状态。
    mDrawerToggle.syncState();
}

@覆盖
公共无效onConfigurationChanged(配置NEWCONFIG){
    super.onConfigurationChanged(NEWCONFIG);
    //传递任何配置更改抽屉toggls
    mDrawerToggle.onConfigurationChanged(NEWCONFIG);
}

}
 

Homefragment

 公共类HomeFragment扩展片段{


私人FragmentTabHost mTab​​Host;

@覆盖
公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,捆绑savedInstanceState){
mTabHost =新FragmentTabHost(getActivity());
mTabHost.setup(getActivity(),getChildFragmentManager(),R.layout.fragment_home);

捆绑ARG1 =新包();
arg1.putInt(精氨酸为Frag1,1);
mTabHost.addTab(mTabHost.newTabSpec(TAB1)。setIndicator(破片TAB1),
    PhotosActivity.class,ARG1);

捆绑ARG2 =新包();
arg2.putInt(精氨酸为Frag2,2);
mTabHost.addTab(mTabHost.newTabSpec(TAB2)。setIndicator(破片TAB2),
    PhotosActivity.class,ARG2);

返回mTabHost;
}

@覆盖
公共无效onDestroyView(){
super.onDestroyView();
mTabHost = NULL;
}
 

fragment_home.xml

 < TabHost的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
     机器人:layout_width =FILL_PARENT
     机器人:layout_height =FILL_PARENT
      机器人:ID =@机器人:ID / tabhost>

    <的LinearLayout
            机器人:ID =@ + ID / LinearLayout01
            机器人:方向=垂直
            机器人:layout_height =FILL_PARENT
            机器人:layout_width =FILL_PARENT>

            < TabWidget
                机器人:ID =@机器人:ID /标签
                机器人:layout_height =WRAP_CONTENT
                机器人:layout_width =FILL_PARENT>
            < / TabWidget>
            < android.support.v4.view.ViewPager
      机器人:ID =@ + ID / view_pager
      机器人:layout_width =match_parent
      机器人:layout_height =match_parent/>

            <的FrameLayout
                机器人:ID =@机器人:ID / tabcontent
                机器人:layout_height =FILL_PARENT
                 机器人:layout_width =FILL_PARENT>
            < /的FrameLayout>

    < / LinearLayout中>

    < / TabHost>
 

解决方案

因此​​,为了做到这一点修改这样的HomeFragment:

 公共类HomeFragment扩展片段{

私人TabHost mTab​​Host;
 私人ViewPager mViewPager;
 私人TabsPagerAdapter mTab​​sAdapter;

@覆盖
 公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,
         捆绑savedInstanceState){

     查看rootView = inflater.inflate(R.layout.fragment_home,集装箱,假);
     mViewPager =(ViewPager)rootView.findViewById(R.id.pager);
     mTabsAdapter =新YourAdapter(getSupportFragmentManager());
     mViewPager.setAdapter(mTabsAdapter);
     PagerSlidingTabStrip标签=(PagerSlidingTabStrip)rootView.findViewById(R.id.tabs);
     tabs.setViewPager(寻呼机);
     返回rootView;
 }
 

您的适配器类

 公共类YourAdapter扩展FragmentStatePagerAdapter {
    私有String []标题= {项目1,项目2,3项};
    公共YourAdapter(FragmentManager FM){
        超(FM);
    }

    @覆盖
    公共片段的getItem(int i)以{
        开关(ⅰ){
           情况下0:{
              返回新FragementA();
           }情况1:{
              返回新FragmentB();
           }案例2:{
              返回新FragmentC();
           }
        }
    }

    @覆盖
    公众诠释getCount将(){
        返回titles.length;
    }

    @覆盖
    公共CharSequence的getPageTitle(INT位置){
        回到标题[位置]
    }
}
 

对于viewpager您的布局文件:

编译这个依赖,才能使用它:编译'com.astuetz:pagerslidingtabstrip:1.0.1

 < LinearLayout中的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:layout_width =match_parent
    机器人:layout_height =WRAP_CONTENT
    机器人:方向=垂直>

    < com.astuetz.PagerSlidingTabStrip
        机器人:ID =@ + ID /标签
        机器人:layout_width =match_parent
        机器人:layout_height =48dip/>

    < android.support.v4.view.ViewPager
        机器人:ID =@ + ID /寻呼机
        机器人:layout_width =match_parent
        机器人:layout_height =WRAP_CONTENT/>

< / LinearLayout中>
 

该viewpager将为每个标签的片段将是这样的:

 公共类碎裂扩展片段{

    @覆盖
    公共查看onCreateView(LayoutInflater充气,
            ViewGroup中的容器,包savedInstanceState){
        查看rootView = inflater.inflate(R.layout.my_layout_file,集装箱,假);
        //简单的实现如何定位文本视图在布局
        按钮电视=(按钮)rootView.findViewById(R.id.my_button_view);
        返回rootView;
    }
}
 

和布局:

 < RelativeLayout的的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    的xmlns:工具=htt​​p://schemas.android.com/tool​​s
    机器人:layout_width =match_parent
    机器人:后台=#CCC
    机器人:layout_height =match_parent>

    <按钮
        机器人:layout_width =WRAP_CONTENT
        机器人:layout_height =WRAP_CONTENT
        机器人:文本=新按钮
        机器人:ID =@ + ID / my_button_view
        机器人:layout_marginTop =175dp/>

< / RelativeLayout的>
 

我希望它能帮助!!!!

I am new to android development,I used navigation drawer from this http://www.androidhive.info/2013/11/android-sliding-menu-using-navigation-drawer/

Now I want to add Tabhost with it..can anyone help me with this? The following is my code I tried..I do not know It is not showing why..

   public class MainActivity extends FragmentActivity {
      private DrawerLayout mDrawerLayout;
      private ListView mDrawerList;
      private ActionBarDrawerToggle mDrawerToggle;

     // nav drawer title
      private CharSequence mDrawerTitle;

    // used to store app title
     private CharSequence mTitle;

     // slide menu items

     private String[] navMenuTitles;
     private TypedArray navMenuIcons;

     private ArrayList<NavDrawerItem> navDrawerItems;
     private NavDrawerListAdapter adapter;

     @Override
     protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTitle = mDrawerTitle = getTitle();

        // load slide menu items
        navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);

        // nav drawer icons from resources
        navMenuIcons = getResources()
                .obtainTypedArray(R.array.nav_drawer_icons);

        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerList = (ListView) findViewById(R.id.list_slidermenu);

        navDrawerItems = new ArrayList<NavDrawerItem>();
        // adding nav drawer items to array
        // Home
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons
                .getResourceId(0, -1)));
        // Find People
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons
                .getResourceId(1, -1)));
        // Photos
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons
                .getResourceId(2, -1)));
        // Communities, Will add a counter here
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[3], navMenuIcons
                .getResourceId(3, -1)));
        // Pages
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[4], navMenuIcons
                .getResourceId(4, -1)));
        // What's hot, We will add a counter here
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[5], navMenuIcons
                .getResourceId(5, -1)));

        // Recycle the typed array
        navMenuIcons.recycle();

        mDrawerList.setOnItemClickListener(new SlideMenuClickListener());

        // setting the nav drawer list adapter
        adapter = new NavDrawerListAdapter(getApplicationContext(),
                navDrawerItems);
        mDrawerList.setAdapter(adapter);

        // enabling action bar app icon and behaving it as toggle button
        getActionBar().setDisplayHomeAsUpEnabled(false);
        getActionBar().setHomeButtonEnabled(true);

        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                R.drawable.ic_drawer, // nav menu toggle icon
                R.string.app_name, // nav drawer open - description for
                                    // accessibility
                R.string.app_name // nav drawer close - description for
                                    // accessibility
        ) {
            public void onDrawerClosed(View view) {
                getActionBar().setTitle(mTitle);
                // calling onPrepareOptionsMenu() to show action bar icons
                getActionBar().setIcon(R.drawable.ic_drawer);
                invalidateOptionsMenu();
            }

            public void onDrawerOpened(View drawerView) {
                getActionBar().setTitle(mDrawerTitle);
                // calling onPrepareOptionsMenu() to hide action bar icons
                getActionBar().setIcon(R.drawable.ic_drawer);
                invalidateOptionsMenu();
            }
        };
        mDrawerLayout.setDrawerListener(mDrawerToggle);

        if (savedInstanceState == null) {
            // on first time display view for first nav item
            displayView(0);
        }
    }

private class SlideMenuClickListener implements
        ListView.OnItemClickListener {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {
        // display view for selected nav drawer item
        displayView(position);
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // toggle nav drawer on selecting action bar app icon/title
    if (mDrawerToggle.onOptionsItemSelected(item)) {
        return true;
    }
    // Handle action bar actions click
    switch (item.getItemId()) {
    case R.id.action_settings:
        return true;

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

/* *
 * Called when invalidateOptionsMenu() is triggered
 */
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    // if nav drawer is opened, hide the action items
    boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
    menu.findItem(R.id.action_settings).setVisible(!drawerOpen);
    return super.onPrepareOptionsMenu(menu);
}

/**
 * Diplaying fragment view for selected nav drawer list item
 * */
private void displayView(int position) {
    // update the main content by replacing fragments
    Fragment fragment = null;
    switch (position) {
    case 0:
        fragment = new HomeFragment();
        break;
   /* case 1:
        fragment = new FindPeopleFragment();
        break;
    case 2:
        fragment = new PhotosFragment();
        break;
    case 3:
        fragment = new CommunityFragment();
        break;
    case 4:
        fragment = new PagesFragment();
        break;
    case 5:
        fragment = new WhatsHotFragment();
        break;
    */
    default:
        break;
    }

    if (fragment != null) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction()
                .replace(R.id.frame_container, fragment).commit();

        // update selected item and title, then close the drawer
        mDrawerList.setItemChecked(position, true);
        mDrawerList.setSelection(position);
        setTitle(navMenuTitles[position]);
        mDrawerLayout.closeDrawer(mDrawerList);
    } else {
        // error in creating fragment
        Log.e("MainActivity", "Error in creating fragment");
    }
}

@Override
public void setTitle(CharSequence title) {
    mTitle = title;
    getActionBar().setTitle(mTitle);
}

/**
 * When using the ActionBarDrawerToggle, you must call it during
 * onPostCreate() and onConfigurationChanged()...
 */

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    // Sync the toggle state after onRestoreInstanceState has occurred.
    mDrawerToggle.syncState();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    // Pass any configuration change to the drawer toggls
    mDrawerToggle.onConfigurationChanged(newConfig);
}

}

Homefragment

public class HomeFragment extends Fragment {


private FragmentTabHost mTabHost;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mTabHost = new FragmentTabHost(getActivity());
mTabHost.setup(getActivity(), getChildFragmentManager(), R.layout.fragment_home);

Bundle arg1 = new Bundle();
arg1.putInt("Arg for Frag1", 1);
mTabHost.addTab(mTabHost.newTabSpec("Tab1").setIndicator("Frag Tab1"),
    PhotosActivity.class, arg1);

Bundle arg2 = new Bundle();
arg2.putInt("Arg for Frag2", 2);
mTabHost.addTab(mTabHost.newTabSpec("Tab2").setIndicator("Frag Tab2"),
    PhotosActivity.class, arg2);

return mTabHost;
}

@Override
public void onDestroyView() {
super.onDestroyView();
mTabHost = null;
}

fragment_home.xml

     <TabHost xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
      android:id="@android:id/tabhost">

    <LinearLayout 
            android:id="@+id/LinearLayout01"
            android:orientation="vertical" 
            android:layout_height="fill_parent"
            android:layout_width="fill_parent">

            <TabWidget 
                android:id="@android:id/tabs"
                android:layout_height="wrap_content" 
                android:layout_width="fill_parent">
            </TabWidget>
            <android.support.v4.view.ViewPager
      android:id="@+id/view_pager"
      android:layout_width="match_parent"
      android:layout_height="match_parent" />

            <FrameLayout 
                android:id="@android:id/tabcontent"
                android:layout_height="fill_parent"
                 android:layout_width="fill_parent">
            </FrameLayout>

    </LinearLayout>

    </TabHost>

解决方案

So in order to do this modify the HomeFragment like this:

public class HomeFragment extends Fragment {

private TabHost mTabHost;
 private ViewPager mViewPager;
 private TabsPagerAdapter mTabsAdapter;

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

     View rootView = inflater.inflate(R.layout.fragment_home, container, false);
     mViewPager = (ViewPager)rootView.findViewById(R.id.pager);
     mTabsAdapter= new YourAdapter(getSupportFragmentManager());
     mViewPager.setAdapter(mTabsAdapter);
     PagerSlidingTabStrip tabs = (PagerSlidingTabStrip)rootView.findViewById(R.id.tabs);
     tabs.setViewPager(pager);
     return rootView;
 }  

Your Adapter Class

public class YourAdapter extends FragmentStatePagerAdapter {
    private String[] titles = { "Item 1", "Item 2", "Item 3" };
    public YourAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int i) {
        switch(i){
           case 0:{
              return new FragementA();
           }case 1:{
              return new FragmentB();
           }case 2:{
              return new FragmentC();
           }
        }
    }

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

    @Override
    public CharSequence getPageTitle(int position) {
        return titles[position];
    }
}

Your layout file for the viewpager:

Compile this dependency in order to use it: compile 'com.astuetz:pagerslidingtabstrip:1.0.1'

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <com.astuetz.PagerSlidingTabStrip
        android:id="@+id/tabs"
        android:layout_width="match_parent"
        android:layout_height="48dip" />

    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

The Fragment that the viewpager will create for each tab will be like:

public class FragmentA extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater,
            ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.my_layout_file, container, false);
        //Simple implementation how to target text view in your layout
        Button tv = (Button)rootView.findViewById(R.id.my_button_view);
        return rootView;
    }
}

And the layout:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:background="#ccc"
    android:layout_height="match_parent">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Button"
        android:id="@+id/my_button_view"
        android:layout_marginTop="175dp" />

</RelativeLayout>

I hope it helps!!!!

这篇关于如何添加tabhost导航抽屉?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆