【问题标题】:How to implement tabs functionality like iOS in my Android app如何在我的 Android 应用中实现类似 iOS 的标签功能
【发布时间】:2016-09-14 16:53:17
【问题描述】:

我正在开发包含五个选项卡的 android 应用程序。每个选项卡都需要多个页面,并且在重新选择选项卡时,它应该继续每个选项卡的第一个片段。以下是我的代码;

TabLayout tabLayout = (TabLayout) findViewById(R.id.tabLayout);
        tabLayout.addTab(tabLayout.newTab().setIcon(R.drawable.icon_discover));
        tabLayout.addTab(tabLayout.newTab().setIcon(R.drawable.icon_my_cuddll));
        tabLayout.addTab(tabLayout.newTab().setIcon(R.drawable.helpicon_feedback));
        tabLayout.addTab(tabLayout.newTab().setIcon(R.drawable.icon_notifications));
        tabLayout.addTab(tabLayout.newTab().setIcon(R.drawable.icon_user));
        tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

        final ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
        final PagerAdaptor adapter = new PagerAdaptor
                (getSupportFragmentManager(), tabLayout.getTabCount());
        viewPager.setAdapter(adapter);
        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
        tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());
                tab.getIcon().setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN);
                if(tab.getPosition()==4)
                {

                }
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
                tab.getIcon().setColorFilter(Color.parseColor("#87243D"), PorterDuff.Mode.SRC_IN);

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {



            }
        });

我的寻呼机适配器类如下:

public class PagerAdaptor extends FragmentStatePagerAdapter {
    int mNumOfTabs;


    public PagerAdaptor(FragmentManager fm, int NumOfTabs) {
        super(fm);
        this.mNumOfTabs = NumOfTabs;

    }

    @Override
    public Fragment getItem(int position) {

        switch (position) {
            case 0:
                CuddllFragment tab1 = new CuddllFragment ();
                return tab1;
            case 1:
                MyCuddllFragment tab2 = new MyCuddllFragment();
                return tab2;
            case 2:
//                CuddllConversationFragment tab3 = new CuddllConversationFragment();
                ConversationFragment conversationFragment = new ConversationFragment();
                return conversationFragment;

            case 3:
//                CuddllNotificationsFragment tab4 = new CuddllNotificationsFragment();
                Tab4ContainerFragment notificationPageFragment = new Tab4ContainerFragment();
                return notificationPageFragment;

            case 4:
                MyProfileFragment tab5 = new MyProfileFragment();
                return tab5;

            default:
                return null;
        }
    }

    @Override
    public int getCount() {
        return mNumOfTabs;
    }

【问题讨论】:

  • 如果您有具体问题,我们很乐意为您提供帮助。但是这个问题现在太宽泛了。听起来您希望我们为您完成工作。如果您有特定问题,请编辑您的问题以重新表述并添加一些您迄今为止尝试过的代码会有所帮助。阅读帮助中心了解更多信息。
  • “每个标签都需要多个页面”——这听起来像是一个糟糕的设计。您不应该在选项卡中包含页面。标签应该是页面本身
  • 是的,但应用程序要求相同。每个选项卡中有多个页面导航。例如,当单击任何列表项时,第一个片段显示列表,然后它将打开详细信息,然后详细信息在同一选项卡中打开成员页面。当再次重新选择相同的选项卡时,它应该进入第一页,即列表。

标签: android android-layout android-fragments android-viewpager android-tablayout


【解决方案1】:

Tab.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".TabFragment"
    android:orientation="vertical">
        <android.support.v4.view.ViewPager
            android:id="@+id/viewpager"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:background="@color/white"/>

        <android.support.design.widget.TabLayout
            android:id="@+id/sliding_tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/orange" />
</LinearLayout>

这里TabFragment.Java

   package com.example.sachin.omcommunication;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class TabFragment extends Fragment {

    public static TabLayout tabLayout;
    public static ViewPager viewPager;
    public static int int_items = 3 ;
    private int[] tabIcons = {
            R.drawable.tab_home,
            R.drawable.arrow,
            R.drawable.tab_home
    };
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View x =  inflater.inflate(R.layout.activity_home_page,null);
        tabLayout = (TabLayout) x.findViewById(R.id.sliding_tabs);
        viewPager = (ViewPager) x.findViewById(R.id.viewpager);

        viewPager.setAdapter(new MyAdapter(getChildFragmentManager()));


        tabLayout.post(new Runnable() {
            @Override
            public void run() {
                tabLayout.setupWithViewPager(viewPager);
                //You tab icons
                int[] icons = {
                        R.drawable.tab_home,
                        R.drawable.arrow,
                        R.drawable.tab_home
                };

                for (int i = 0; i < tabLayout.getTabCount(); i++) {
                    tabLayout.getTabAt(i).setIcon(icons[i]);
                }
            }
        });
        tabLayout.setupWithViewPager(viewPager);


        return x;

    }
    class MyAdapter extends FragmentPagerAdapter {

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

        /**
         * Return fragment with respect to Position .
         */

        @Override
        public android.support.v4.app.Fragment getItem(int position)
        {
            switch (position){
                case 0 : return new HomePage();
                case 1 : return new Attendence();
                case 2 : return new Delivery();
            }
            return null;
        }

        @Override
        public int getCount() {

            return int_items;

        }

        /**
         * This method returns the title of the tab according to the position.
         */

        @Override
        public CharSequence getPageTitle(int position) {

            switch (position){
                case 0 :
                    return "Primary";
                case 1 :
                    return "Social";
                case 2 :
                    return "Updates";
            }
            return null;
        }
    }

}

试试这个..可能对你有用。

【讨论】:

  • 我也这样做了。我的问题是如何替换标签内的片段,当我重新选择同一个标签时,它应该再次打开第一个片段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
  • 2013-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多