如何在同一活动中添加导航抽屉和标签小部件?

时间:2013-12-31 07:05:45

标签: android android-layout android-tabhost android-navigation

我想将滑动抽屉添加到操作栏和应用程序的标签窗口小部件。

我使用Creating a Navigation Drawer

创建导航抽屉的指南。我试图将标签小部件添加到此。但我不能。

任何人都可以帮助我在操作栏后添加标签小部件。

像这样。 layout

这是xml文件。

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!-- The main content view -->
    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    <!-- The navigation drawer -->
    <ListView android:id="@+id/left_drawer"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp"
        android:background="#111"/>
</android.support.v4.widget.DrawerLayout>

如何为此添加标签小部件作为提及布局?

2 个答案:

答案 0 :(得分:1)

anurudhika你应该使用我的代码,这将帮助你

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<!-- Framelayout to display Fragments -->

<FrameLayout
    android:id="@+id/frame_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TabHost
        android:id="@android:id/tabhost"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="#ffffff" >

        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0" >
        </TabWidget>

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:orientation="vertical" >

            <FrameLayout
                android:id="@android:id/tabcontent"
                android:layout_width="fill_parent"
                android:layout_height="0px"
                android:layout_weight="1" >
            </FrameLayout>
        </LinearLayout>
    </TabHost>
</FrameLayout>

<!-- Listview to display slider menu -->

<ListView
    android:id="@+id/list_slidermenu"
    android:layout_width="240dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:background="@color/list_background"
    android:choiceMode="singleChoice"
    android:divider="@color/list_divider"
    android:dividerHeight="1dp"
    android:listSelector="@drawable/list_selector" />

答案 1 :(得分:0)

在TabActivity中写下以下代码

public class TabActivity extends FragmentActivity implements OnTabChangeListener {
    TextView txt;

    private DrawerLayout mDrawerLayout;
    private ListView mDrawerList;
    private ActionBarDrawerToggle mDrawerToggle;

    private CharSequence mDrawerTitle;
    private CharSequence mTitle;
    private String[] mPlanetTitles;

    private TabHost mTabHost;
    private HashMap mapTabInfo = new HashMap();
    private TabInfo mLastTab = null;
    public static Stack<Fragment> mStackTabHomeScreen = new Stack<Fragment>();
    public static Stack<Fragment> mStackTabSecondScreen = new Stack<Fragment>();

    private HomeScreen mHomeScreen;
    private SecondHomeScreen mSecondHomeScreen;
    private FragmentTransaction fragmentTransaction;
    private FragmentManager fragmentManager;

    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;
        }

        public View createTabContent(String tag) {
            View v = new View(mContext);
            v.setMinimumWidth(0);
            v.setMinimumHeight(0);
            return v;
        }
    }

    @SuppressLint("NewApi")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.tabs);

        mTitle = mDrawerTitle = getTitle();
        mPlanetTitles = getResources().getStringArray(R.array.planets_array);
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerList = (ListView) findViewById(R.id.left_drawer);

        // set a custom shadow that overlays the main content when the drawer
        // opens
        mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
        // set up the drawer's list view with items and click listener
        mDrawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, mPlanetTitles));
        mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

        // enable ActionBar app icon to behave as action to toggle nav drawer
        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);

        // ActionBarDrawerToggle ties together the the proper interactions
        // between the sliding drawer and the action bar app icon
        mDrawerToggle = new ActionBarDrawerToggle(this, /* host Activity */
        mDrawerLayout, /* DrawerLayout object */
        R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */
        R.string.drawer_open, /* "open drawer" description for accessibility */
        R.string.drawer_close /* "close drawer" description for accessibility */
        ) {
            public void onDrawerClosed(View view) {
                getActionBar().setTitle(mTitle);
                invalidateOptionsMenu(); // creates call to
                                            // onPrepareOptionsMenu()
            }

            public void onDrawerOpened(View drawerView) {
                getActionBar().setTitle(mDrawerTitle);
                invalidateOptionsMenu(); // creates call to
                                            // onPrepareOptionsMenu()
            }
        };
        mDrawerLayout.setDrawerListener(mDrawerToggle);

        if (savedInstanceState == null) {
            selectItem(0);
        }
        mDrawerToggle.setDrawerIndicatorEnabled(true);

        mHomeScreen = new HomeScreen();
        mSecondHomeScreen = new SecondHomeScreen();
        fragmentManager = getSupportFragmentManager();

        initialiseTabHost(savedInstanceState);
        if (savedInstanceState != null) {
            mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab"));
        }
    }

    /* Called whenever we call invalidateOptionsMenu() */
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        // If the nav drawer is open, hide action items related to the content
        // view
        boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
        return super.onPrepareOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // The action bar home/up action should open or close the drawer.
        // ActionBarDrawerToggle will take care of this.
        if (mDrawerToggle.onOptionsItemSelected(item)) {
            return true;
        }
        // Handle action buttons
        switch (item.getItemId()) {
        default:
            return super.onOptionsItemSelected(item);
        }
    }

    /* The click listner for ListView in the navigation drawer */
    private class DrawerItemClickListener implements ListView.OnItemClickListener {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            //selectItem(position);

            if (position == 0) {
                selectItem(position);
                FragmentManager fragmentManager = getSupportFragmentManager();
                FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                BarcodeScreen mBarcodeScreen = new BarcodeScreen();
                fragmentTransaction.replace(R.id.realtabcontent, mBarcodeScreen);
                TabActivity.mStackTabHomeScreen.add(mBarcodeScreen);
                fragmentTransaction.commit();

                Toast.makeText(getApplicationContext(), "Position : " + position, 1000).show();
                mDrawerLayout.closeDrawer(mDrawerList);
            }
            else if (position == 1) {
                selectItem(position);
                Toast.makeText(getApplicationContext(), "Position : " + position, 1000).show();

                mDrawerLayout.closeDrawer(mDrawerList);
            }
            else if (position == 2) {
                selectItem(position);
                Toast.makeText(getApplicationContext(), "Position : " + position, 1000).show();

                mDrawerLayout.closeDrawer(mDrawerList);
            }
            else if (position == 3) {
                selectItem(position);
                Toast.makeText(getApplicationContext(), "Position : " + position, 1000).show();

                mDrawerLayout.closeDrawer(mDrawerList);
            }

        }
    }

    private void selectItem(int position) {
        // update the main content by replacing fragments
        Fragment fragment = new HomeScreen();
        Bundle args = new Bundle();
        args.putInt(HomeScreen.ARG_PLANET_NUMBER, position);
        fragment.setArguments(args);

        //      FragmentManager fragmentManager = getFragmentManager();
        //      fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();

        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();

        // update selected item and title, then close the drawer
        mDrawerList.setItemChecked(position, true);
        setTitle(mPlanetTitles[position]);
        mDrawerLayout.closeDrawer(mDrawerList);
    }

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

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

    /**
     * Step 2: Setup TabHost
     */
    private void initialiseTabHost(Bundle args) {
        mTabHost = (TabHost) findViewById(android.R.id.tabhost);
        mTabHost.setup();
        TabInfo tabInfo = null;
        TabActivity.addTab(this, this.mTabHost, this.mTabHost.newTabSpec("HomeScreen").setIndicator("HomeScreen"), (tabInfo = new TabInfo("HomeScreen", HomeScreen.class, args)));
        this.mapTabInfo.put(tabInfo.tag, tabInfo);

        TabActivity.addTab(this, this.mTabHost, this.mTabHost.newTabSpec("SecondScreen").setIndicator("SecondScreen"), (tabInfo = new TabInfo("SecondScreen", SecondHomeScreen.class, args)));
        this.mapTabInfo.put(tabInfo.tag, tabInfo);

        // Default to first tab
        this.onTabChanged("HomeScreen");
        //
        mTabHost.setOnTabChangedListener((OnTabChangeListener) this);
    }

    private static void addTab(TabActivity activity, TabHost tabHost, TabHost.TabSpec tabSpec, TabInfo tabInfo) { // Attach a Tab view
                                                                                                                    // factory to the spec
        tabSpec.setContent(activity.new TabFactory(activity));
        String tag = tabSpec.getTag();
        // 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.

        tabInfo.fragment = activity.getSupportFragmentManager().findFragmentByTag(tag);
        if (tabInfo.fragment != null && !tabInfo.fragment.isDetached()) {
            FragmentTransaction ft = activity.getSupportFragmentManager().beginTransaction();
            ft.detach(tabInfo.fragment);
            ft.commit();
            activity.getSupportFragmentManager().executePendingTransactions();
        }
        tabHost.addTab(tabSpec);
    }

    /**
     * (non-Javadoc) * @see
     * android.widget.TabHost.OnTabChangeListener#onTabChanged(java.lang.String)
     */
    public void onTabChanged(String tag) {
        TabInfo newTab = (TabInfo) this.mapTabInfo.get(tag);

        if (mTabHost.getCurrentTabTag() == "HomeScreen") {

            if (mStackTabHomeScreen.size() > 0) {
                Fragment fragment = mStackTabHomeScreen.get(mStackTabHomeScreen.size() - 1);
                fragmentTransaction = fragmentManager.beginTransaction();
                fragmentTransaction.replace(R.id.realtabcontent, fragment);
                fragmentTransaction.commit();
            }
            else {
                fragmentTransaction = fragmentManager.beginTransaction();
                fragmentTransaction.replace(R.id.realtabcontent, mHomeScreen);
                mStackTabHomeScreen.add(mHomeScreen);
                fragmentTransaction.commit();

            }

        }
        if (mTabHost.getCurrentTabTag() == "SecondScreen") {

            if (mStackTabSecondScreen.size() > 0) {
                Fragment fragment = mStackTabSecondScreen.get(mStackTabSecondScreen.size() - 1);
                fragmentTransaction = fragmentManager.beginTransaction();
                fragmentTransaction.replace(R.id.realtabcontent, fragment);
                fragmentTransaction.commit();
            }
            else {
                fragmentTransaction = fragmentManager.beginTransaction();
                fragmentTransaction.replace(R.id.realtabcontent, mSecondHomeScreen);
                mStackTabSecondScreen.add(mSecondHomeScreen);
                fragmentTransaction.commit();

            }
        }

        /*      if (mLastTab != newTab) {
                    FragmentTransaction ft = this.getSupportFragmentManager()
                            .beginTransaction();
                    if (mLastTab != null) {
                        if (mLastTab.fragment != null) {
                            ft.detach(mLastTab.fragment);
                        }
                    }
                    if (newTab != null) {
                        if (newTab.fragment == null) {
                            newTab.fragment = Fragment.instantiate(this,
                                    newTab.clss.getName(), newTab.args);
                            ft.add(R.id.realtabcontent, newTab.fragment, newTab.tag);
                        } else {
                            ft.attach(newTab.fragment);

                        }
                    }
                    mLastTab = newTab;
                    ft.commit();
                    this.getSupportFragmentManager().executePendingTransactions();

                }*/
    }

    @Override
    public void onBackPressed() {

        if (mTabHost.getCurrentTabTag() == "HomeScreen") {

            if (mStackTabHomeScreen.size() > 1) {

                Fragment fragment = mStackTabHomeScreen.get(mStackTabHomeScreen.size() - 2);
                fragmentTransaction = fragmentManager.beginTransaction();
                fragmentTransaction.replace(R.id.realtabcontent, fragment);
                mStackTabHomeScreen.pop();
                fragmentTransaction.commit();
            }

        }

        if (mTabHost.getCurrentTabTag() == "SecondScreen") {

            if (mStackTabSecondScreen.size() > 1) {

                Fragment fragment = mStackTabSecondScreen.get(mStackTabSecondScreen.size() - 2);
                fragmentTransaction = fragmentManager.beginTransaction();
                fragmentTransaction.replace(R.id.realtabcontent, fragment);
                mStackTabSecondScreen.pop();
                fragmentTransaction.commit();
            }
        }

    }
}

在你的xml中: -

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/relative"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <android.support.v4.widget.DrawerLayout
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

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

            <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:orientation="vertical" >

                <FrameLayout
                    android:id="@+android:id/realtabcontent"
                    android:layout_width="fill_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1" />

                <FrameLayout
                    android:id="@android:id/tabcontent"
                    android:layout_width="0dp"
                    android:layout_height="0dp"
                    android:layout_weight="0" />

                <TabWidget
                    android:id="@android:id/tabs"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="-4dp"
                    android:layout_weight="0" />
            </LinearLayout>
        </TabHost>

        <FrameLayout
            android:id="@+id/content_frame"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

        <ListView
            android:id="@+id/left_drawer"
            android:layout_width="240dp"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:background="#111"
            android:choiceMode="singleChoice"
            android:divider="@android:color/transparent"
            android:dividerHeight="0dp" />


    </android.support.v4.widget.DrawerLayout>

</RelativeLayout>

希望你能解决问题。 祝好运!! :)