【问题标题】:android material design click event on tabs标签上的android材料设计点击事件
【发布时间】:2016-01-23 03:34:37
【问题描述】:

在我的 Android 项目中,我将 Material-design 用于标签视图。 我有:

tab_activity.xml

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:layout_scrollFlags="scroll|enterAlways"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

    <android.support.design.widget.TabLayout
        android:id="@+id/tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:tabMode="fixed"
        app:tabGravity="fill"/>
</android.support.design.widget.AppBarLayout>

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

而java类文件是:

public class SimpleTabsActivity extends AppCompatActivity {

    private Toolbar toolbar;
    private TabLayout tabLayout;
    private ViewPager viewPager;

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

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

    private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFragment(new OneFragment(), "ONE");
        adapter.addFragment(new TwoFragment(), "TWO");
        adapter.addFragment(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 addFragment(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }

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

有了这个我得到标签视图.. 但是,在这里如何删除应用名称旁边的箭头? 并且,滑动选项卡正在工作,但是当我单击任何选项卡(tab1/tab2/tab3)时,单击事件不起作用。为什么??

【问题讨论】:

  • 这里的工作代码可以作为参考:stackoverflow.com/questions/31698756/…
  • 您使用的是setContentView(R.layout.activity_simple_tabs),但您发布了tab_activity.xml - 您实际使用的是哪个?
  • 有如何禁用手指滑动,第二个遮阳篷stackoverflow.com/questions/9650265/…
  • 我认为这个问题在这里或互联网上的任何其他地方都没有得到解答。 @Preeti,下面user3553286的解决方案真的有效吗?我不知道它是如何工作的... tabLayout.setOnTabSelectedListener 只监听选项卡的选定状态(作为滑动的结果),而不是实际按下选项卡的视图。

标签: android


【解决方案1】:

我认为你应该使用这个:

MainActivity.java

       @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);

            TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);
            tabLayout.addTab(tabLayout.newTab().setText("Tab 1"));
            tabLayout.addTab(tabLayout.newTab().setText("Tab 2"));
            tabLayout.addTab(tabLayout.newTab().setText("Tab 3"));
            tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

            final ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
            final PagerAdapter adapter = new PagerAdapter
                    (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());
                }

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

                }

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

                }
            });
        }

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

添加一个PagerAdapter类,添加片段..

activity_main.xml

<RelativeLayout
    android:id="@+id/main_layout"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:background="?attr/colorPrimary"
        android:elevation="6dp"
        android:minHeight="?attr/actionBarSize"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

    <android.support.design.widget.TabLayout
        android:id="@+id/tab_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/toolbar"
        android:background="?attr/colorPrimary"
        android:elevation="6dp"
        android:minHeight="?attr/actionBarSize"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>

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

</RelativeLayout>

我认为这应该可行..

【讨论】:

  • 这不再适用于错误“PagerAdapter 是抽象的;无法实例化”。
【解决方案2】:

只需为 TabLayout 设置 clickable=true

  <android.support.design.widget.TabLayout
    android:id="@+id/tabs_home"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:tabPaddingStart="0dp"
    app:tabPaddingEnd="0dp"
    app:tabIndicatorHeight="3dp"
    android:clickable="true"
    app:tabMaxWidth="0dp"/>

【讨论】:

    【解决方案3】:

    我认为您的问题源于试图将内容混合到 TabView 中,而实际上它没有得到您想要查看的内容的提示。

    如果您的主要活动设置实际上没有使用侧边栏菜单,我建议只使用 ActionBar。在这里,我只设置了通用名称,您可以相应地加载片段名称。

    在 MainActivity.xml 中

    protected void onCreate(android.os.Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            ActionBar bar = getActionBar();
            bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    
            Tab listTab = bar.newTab().setText(R.string.list_title);
            Tab generalTab = bar.newTab().setText(R.string.generalsettings);
            Tab faqtab = bar.newTab().setText(R.string.faq);
            Tab abouttab = bar.newTab().setText(R.string.about);
    
            listTab.setTabListener(new TabListener<ProfileList>("profiles", ProfileList.class));
            generalTab.setTabListener(new TabListener<GeneralSettings>("settings", GeneralSettings.class));
            faqtab.setTabListener(new TabListener<FaqFragment>("faq", FaqFragment.class));
            abouttab.setTabListener(new TabListener<AboutFragment>("about", AboutFragment.class));
    
            bar.addTab(listTab);
            bar.addTab(generalTab);
            bar.addTab(faqtab);
            bar.addTab(abouttab);
    
            if(SendDumpFragment.getLastestDump(this)!=null) {
                Tab sendDump = bar.newTab().setText(R.string.crashdump);
                sendDump.setTabListener(new TabListener<SendDumpFragment>("crashdump",SendDumpFragment.class));
                bar.addTab(sendDump);
            }
    
        }
    
        protected class TabListener<T extends Fragment> implements ActionBar.TabListener
        {
            private Fragment mFragment;
            private String mTag;
            private Class<T> mClass;
    
    
            public TabListener(String tag, Class<T> clz) {
                mTag = tag;
                mClass = clz;
    
                // 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.
                mFragment = getFragmentManager().findFragmentByTag(mTag);
                if (mFragment != null && !mFragment.isDetached()) {
                    FragmentTransaction ft = getFragmentManager().beginTransaction();
                    ft.detach(mFragment);
                    ft.commit();
                }
            }
    
            public void onTabSelected(Tab tab, FragmentTransaction ft) {
                if (mFragment == null) {
                    mFragment = Fragment.instantiate(MainActivity.this, mClass.getName());
                    ft.add(android.R.id.content, mFragment, mTag);
                } else {
                    ft.attach(mFragment);
                }
            }
    
            public void onTabUnselected(Tab tab, FragmentTransaction ft) {
                if (mFragment != null) {
                    ft.detach(mFragment);
                }
            }
    
    
            @Override
            public void onTabReselected(Tab tab, FragmentTransaction ft) {
    
            }
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
    
            System.out.println(data);
    
    
        }
    

    【讨论】:

    • 我已经尝试过所有这些......你知道......android.app.ActionBar.Tab......在android-6中被弃用了吗??
    • 如果您的 Target 是 6.0+,请使用此处提供的示例:blog.grafixartist.com/…
    猜你喜欢
    • 2016-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 2019-02-16
    • 2015-06-24
    • 2018-12-12
    相关资源
    最近更新 更多