Adding Sliding Tabs using Support Library v7:21 with Toolbar in Android Developer Tools for existing project

后端 未结 4 963
青春惊慌失措
青春惊慌失措 2020-12-30 08:55

I have already read the information in this link: Use Tab with new ToolBar (AppCompat v7-21) and did a lot of research on the same.

But the problem is the SlidingTab

相关标签:
4条回答
  • 2020-12-30 08:58

    I also had the same problem. Since that Android is changing the usage of ActionBar and Tabs again and again it is really hard to know what is the most appropriate implementation of it.

    So I followed the sample that is shown here but I added some additional functionalities. You can see my version and its' usage on this gist.

    What I added are;

    • Enabling giving tabs equal width (if there are two tabs they'll have half width of actionbar)
    • Showing image instead of text or showing both (with your custom view) text and image at tabs

    UPDATE

    There is a new layout called Tab Layout within the support library. You can use it instead.

    Also you can see another response here tells more about it.

    0 讨论(0)
  • 2020-12-30 09:02

    Just add ViewPager and SlidingTabLayout to your xml:

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

    In your Code create an Adapter for your ViewPager (as example FragmentPagerAdapter) and bind them to your ViewPager, after bind the SlidingTabLayout to your ViewPager:

    mViewPager = (ViewPager) findViewById(R.id.pager);
    mViewPager.setAdapter(mSectionsPagerAdapter);
    
    final SlidingTabLayout tabLayout = (SlidingTabLayout)findViewById(R.id.sliding_tabs);
    tabLayout.setViewPager(mViewPager);
    
    0 讨论(0)
  • 2020-12-30 09:08

    1 . Copy SlidingTabLayout.java from https://developer.android.com/samples/SlidingTabsColors/src/com.example.android.common/view/SlidingTabLayout.html and paste it in your package.

    MainActivity.java

    package com.example.mysliding;
    
    import com.example.android.common.view.SlidingTabLayout;
    import com.example.mysliding.SlidingTabsBasicFragment.SamplePagerAdapter;
    
    import android.support.v4.app.FragmentTransaction;
    import android.support.v4.view.PagerAdapter;
    import android.support.v4.view.ViewPager;
    import android.support.v7.app.ActionBarActivity;
    import android.support.v7.widget.Toolbar;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;
    
    public class MainActivity extends ActionBarActivity {
    
    static final String LOG_TAG = "SlidingTabsBasicFragment";
    private SlidingTabLayout mSlidingTabLayout;
    private ViewPager mViewPager;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_sample);
        Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
    
        mViewPager = (ViewPager) findViewById(R.id.viewpager);
        mViewPager.setAdapter(new SamplePagerAdapter());
        mSlidingTabLayout = (SlidingTabLayout) findViewById(R.id.sliding_tabs);
        mSlidingTabLayout.setViewPager(mViewPager);
    
        /*
         * FragmentTransaction transaction =
         * getSupportFragmentManager().beginTransaction();
         * SlidingTabsBasicFragment fragment = new SlidingTabsBasicFragment();
         * transaction.replace(R.id.sample_content_fragment, fragment);
         * transaction.commit();
         */
    
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
    
    class SamplePagerAdapter extends PagerAdapter {
    
        /**
         * @return the number of pages to display
         */
        @Override
        public int getCount() {
            return 5;
        }
    
        /**
         * @return true if the value returned from
         *         {@link #instantiateItem(ViewGroup, int)} is the same object
         *         as the {@link View} added to the {@link ViewPager}.
         */
        @Override
        public boolean isViewFromObject(View view, Object o) {
            return o == view;
        }
    
        // BEGIN_INCLUDE (pageradapter_getpagetitle)
        /**
         * Return the title of the item at {@code position}. This is important
         * as what this method returns is what is displayed in the
         * {@link SlidingTabLayout}.
         * <p>
         * Here we construct one using the position value, but for real
         * application the title should refer to the item's contents.
         */
        @Override
        public CharSequence getPageTitle(int position) {
            return "Item " + (position + 1);
        }
    
        // END_INCLUDE (pageradapter_getpagetitle)
    
        /**
         * Instantiate the {@link View} which should be displayed at
         * {@code position}. Here we inflate a layout from the apps resources
         * and then change the text view to signify the position.
         */
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            // Inflate a new layout from our resources
    
            View view = getLayoutInflater().inflate(R.layout.pager_item,
                    container, false);
            // Add the newly created View to the ViewPager
            container.addView(view);
    
            // Retrieve a TextView from the inflated View, and update it's text
            TextView title = (TextView) view.findViewById(R.id.item_title);
            title.setText(String.valueOf(position + 1));
    
            Log.i(LOG_TAG, "instantiateItem() [position: " + position + "]");
    
            // Return the View
            return view;
        }
    
        /**
         * Destroy the item from the {@link ViewPager}. In our case this is
         * simply removing the {@link View}.
         */
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View) object);
            Log.i(LOG_TAG, "destroyItem() [position: " + position + "]");
        }
    
    }
    

    }

    fragment_sample.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <android.support.v7.widget.Toolbar
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:id="@+id/my_awesome_toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" 
            android:minHeight="?attr/actionBarSize"
    
            app:theme="@style/ThemeOverlay.AppCompat.ActionBar">
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content" >
    
                <com.example.android.common.view.SlidingTabLayout
                    android:id="@+id/sliding_tabs"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content" />
            </LinearLayout>
        </android.support.v7.widget.Toolbar>
    
        <android.support.v4.view.ViewPager
            android:id="@+id/viewpager"
            android:layout_width="match_parent"
            android:layout_height="0px"
            android:layout_weight="1"
            android:background="@android:color/white" />
    
    </LinearLayout>
    

    Pager_item.xml

    <?xml version="1.0" encoding="utf-8"?>
    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:orientation="vertical"
          android:gravity="center">
    
        <TextView
              android:id="@+id/item_subtitle"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:textAppearance="?android:attr/textAppearanceLarge"
              android:text="Page:"/>
    
        <TextView
              android:id="@+id/item_title"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:textSize="80sp" />
    
    </LinearLayout>
    
    0 讨论(0)
  • 2020-12-30 09:11

    Just found this library that seemes to be pretty much what is mentioned here already, but with less manual lifting. Have a look at https://github.com/neokree/MaterialTabs.

    To shamelessly plug my self, this is a sample of it in action https://play.google.com/store/apps/details?id=com.snilius.fhstats.

    The only thing missing from it at the point of writing this is having the tab indicator sliding between tabs when paging the viewpager, like is does on Google Play.

    0 讨论(0)
提交回复
热议问题