简体   繁体   English

Android:如何将自定义标签添加到TabbedActivity?

[英]Android: How to add custom tab to TabbedActivity?

I have this activity: 我有这个活动:

I created it with New Activity->Tabbed Activity in Android Studio 1.5 我在Android Studio 1.5中使用“新建活动”->“带标签的活动”创建了它

在此处输入图片说明

They provided me with the following code which is generated when you create this kind of activity: 他们为我提供了以下代码,这些代码是在您创建此类活动时生成的:

public class Main2Activity extends AppCompatActivity {

/**
 * The {@link android.support.v4.view.PagerAdapter} that will provide
 * fragments for each of the sections. We use a
 * {@link FragmentPagerAdapter} derivative, which will keep every
 * loaded fragment in memory. If this becomes too memory intensive, it
 * may be best to switch to a
 * {@link android.support.v4.app.FragmentStatePagerAdapter}.
 */
private SectionsPagerAdapter mSectionsPagerAdapter;

/**
 * The {@link ViewPager} that will host the section contents.
 */
private ViewPager mViewPager;

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

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    // Create the adapter that will return a fragment for each of the three
    // primary sections of the activity.
    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

    // Set up the ViewPager with the sections adapter.
    mViewPager = (ViewPager) findViewById(R.id.container);
    mViewPager.setAdapter(mSectionsPagerAdapter);

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(mViewPager);

    //--------------------------------------------------------------------
    //Here is the custom code

    View view = getLayoutInflater().inflate(R.layout.custom_tab,null);
    view.findViewById(R.id.custom_tab_imageView).setBackgroundResource(R.mipmap.ic_launcher);
    TabLayout.Tab tab = tabLayout.newTab().setCustomView(view);
    tabLayout.addTab(tab);
    //----------------------------------------------------------------------

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });

}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main2, 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();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

/**
 * A placeholder fragment containing a simple view.
 */
public static class PlaceholderFragment extends Fragment {
    /**
     * The fragment argument representing the section number for this
     * fragment.
     */
    private static final String ARG_SECTION_NUMBER = "section_number";

    public PlaceholderFragment() {
    }

    /**
     * Returns a new instance of this fragment for the given section
     * number.
     */
    public static PlaceholderFragment newInstance(int sectionNumber) {
        PlaceholderFragment fragment = new PlaceholderFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main2, container, false);
        TextView textView = (TextView) rootView.findViewById(R.id.section_label);
        textView.setText(getString(R.string.section_format, getArguments().getInt(ARG_SECTION_NUMBER)));
        return rootView;
    }
}

/**
 * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
 * one of the sections/tabs/pages.
 */
public class SectionsPagerAdapter extends FragmentPagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        // getItem is called to instantiate the fragment for the given page.
        // Return a PlaceholderFragment (defined as a static inner class below).
        return PlaceholderFragment.newInstance(position + 1);
    }

    @Override
    public int getCount() {
        // Show 3 total pages.
        return 3;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        switch (position) {
            case 0:
                return "SECTION 1";
            case 1:
                return "SECTION 2";
            case 2:
                return "SECTION 3";
        }
        return null;
    }
}

I wanted to add a new custom tab besides the three existing so I created custom_tab.xml that contains an ImageView with id=custom_tab_imageView and added the following to onCreate(): 我想在现有的三个标签之外添加一个新的自定义标签,因此我创建了custom_tab.xml,其中包含一个id = custom_tab_imageView的ImageView,并将以下内容添加到onCreate():

View view = getLayoutInflater().inflate(R.layout.custom_tab,null);
  view.findViewById(R.id.custom_tab_imageView).setBackgroundResource(R.mipmap.ic_launcher);
TabLayout.Tab tab = tabLayout.newTab().setCustomView(view);
tabLayout.addTab(tab);

In SECTION 1,2,3 there is a PlaceholderFragment shown that say "Hello World from section..." 在第1,2,3节中,显示了一个PlaceholderFragment,上面写着“ Hello World from section ...”。

How do I need to modify the SectionsPagerAdapter in order to show "Hello world from section 4" when user tap the custom tab? 当用户点击自定义标签时,如何修改SectionsPagerAdapter以便显示“第4节的Hello world”? Or how do I make the adapter recognize it as the fourth tab? 或者如何使适配器将其识别为第四个选项卡?

All the magic happens in FragmentPagerAdapter. 所有的魔术都发生在FragmentPagerAdapter中。

In short, 简而言之,

Override getCount() method to define number of tabs. 重写getCount()方法以定义选项卡的数量。

Define titles of each tab in getPageTitle() method getPageTitle()方法中定义每个选项卡的标题

and of course, getItem() to return Fragment for ViewPager - and link it's position with TabLayout. 当然,使用getItem()返回ViewPager的Fragment-并将其位置与TabLayout链接起来。

In your case, to add a new tab... 您的情况下,要添加新标签...

  1. Create a Fragment 创建一个片段

  2. Add the following case in switch block of getPageTitle() method to add Tab at the last position: getPageTitle()方法的switch块中添加以下case ,以将Tab添加到最后一个位置:

     case 3: return 'SECTION 4'; 
  3. return the Fragment from getItem() method when position is 3 : 当position为3时,从getItem()方法返回Fragment

     if (position == 3) { return <new instance of your Fragment>; } 

Update: 更新:

Well, how about this? 好吧,这呢?

view.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        mViewPager.setCurrentItem(3);
    }
});

If this is what you want, then you need to modify your code. 如果这是您想要的,那么您需要修改您的代码。 Almost all of it. 几乎全部。

This will allow you to set a custom tab view along with Image and text 这将允许您设置自定义选项卡视图以及图像和文本

Create an xml layout named custom_tab.xml 创建一个名为custom_tab.xml的xml布局

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/tab"
    android:textColor="@color/colorAccent"
    android:textSize="@dimen/tab_label"
    android:fontFamily="@string/font_fontFamily_medium"/>

Render custom_tab.xml layout in each tab using below lines of code. 使用下面的代码行在每个选项卡中呈现custom_tab.xml布局。

TextView tabOne = (TextView) LayoutInflater.from(this).inflate(R.layout.custom_tab, null);
tabOne.setText("ONE");
tabOne.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.ic_tab_favourite, 0, 0);
tabLayout.getTabAt(0).setCustomView(tabOne);

Complete class code: 完整的课程代码:

public class MainActivity extends AppCompatActivity {

    private Toolbar toolbar;
    private TabLayout tabLayout;
    private ViewPager viewPager;
    private int[] tabIcons = {
            R.drawable.ic_tab_favourite,
            R.drawable.ic_tab_call,
            R.drawable.ic_tab_contacts
    };

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

        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        viewPager = (ViewPager) findViewById(R.id.viewpager);
        setupViewPager(viewPager);

        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);
        setupTabIcons();
    }

    private void setupTabIcons() {

        TextView tabOne = (TextView) LayoutInflater.from(this).inflate(R.layout.custom_tab, null);
        tabOne.setText("ONE");
        tabOne.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.ic_tab_favourite, 0, 0);
        tabLayout.getTabAt(0).setCustomView(tabOne);

        TextView tabTwo = (TextView) LayoutInflater.from(this).inflate(R.layout.custom_tab, null);
        tabTwo.setText("TWO");
        tabTwo.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.ic_tab_call, 0, 0);
        tabLayout.getTabAt(1).setCustomView(tabTwo);

        TextView tabThree = (TextView) LayoutInflater.from(this).inflate(R.layout.custom_tab, null);
        tabThree.setText("THREE");
        tabThree.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.ic_tab_contacts, 0, 0);
        tabLayout.getTabAt(2).setCustomView(tabThree);
    }

    private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFrag(new OneFragment(), "ONE");
        adapter.addFrag(new TwoFragment(), "TWO");
        adapter.addFrag(new ThreeFragment(), "THREE");
        viewPager.setAdapter(adapter);
    }

    class ViewPagerAdapter extends FragmentPagerAdapter {
        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();

        public ViewPagerAdapter(FragmentManager manager) {
            super(manager);
        }

        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }

        @Override
        public int getCount() {
            return mFragmentList.size();
        }

        public void addFrag(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitleList.get(position);
        }
    }
}

I found the solution: 我找到了解决方案:

public class SectionsPagerAdapter extends FragmentPagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        // getItem is called to instantiate the fragment for the given page.
        // Return a PlaceholderFragment (defined as a static inner class below).
        switch (position) {
            case 0:
                return PlaceholderFragment.newInstance("Gallery");
            case 1:
                return PlaceholderFragment.newInstance("Chat");
            case 2:
                return PlaceholderFragment.newInstance("People");
            default:
                return null;
        }
    }

    @Override
    public int getCount() {
        // Show 3 total pages.
        return 3;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        /*switch (position) {
            case 0:
                return "Gallery";
            case 1:
                return "Chat";
            case 2:
                return "People";
        }*/

        // Return null to display only icons
        return null;
    }
}

Create a custom tab and call setCustomView() method: 创建一个自定义选项卡并调用setCustomView()方法:

private void setupTabIcons() {

    View view0 = getLayoutInflater().inflate(R.layout.custom_tab, null);
    view0.findViewById(R.id.custom_imageView).setBackgroundResource(tabIcons[0]);

    View view1 = getLayoutInflater().inflate(R.layout.custom_tab, null);
    view1.findViewById(R.id.custom_imageView).setBackgroundResource(tabIcons[1]);

    View view2 = getLayoutInflater().inflate(R.layout.custom_tab, null);
    view2.findViewById(R.id.custom_imageView).setBackgroundResource(tabIcons[2]);

    tabLayout.getTabAt(0).setCustomView(view0);
    tabLayout.getTabAt(1).setCustomView(view1);
    tabLayout.getTabAt(2).setCustomView(view2);

}

In onCreate() call setupTabIcons() and that's it. onCreate()调用setupTabIcons()就是这样。 You have 3 custom tabs connected to 3 fragments for your TabbedActivity. 您有3个自定义选项卡,分别连接到TabbedActivity的3个片段。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM