【问题标题】:How to use SherlockFragmentActivity with SlidingMenu?如何将 SherlockFragmentActivity 与 SlidingMenu 一起使用?
【发布时间】:2013-09-11 13:43:55
【问题描述】:

我正在使用SlidingMenu,它使用不同类型的Fragment/SherlockFragment 作为菜单。
我需要SherlockFragmentActivity,因为我在菜单中使用Tabs
如何在 SlidingMenu 中使用 SherlockFragmentActivity

如果不可能,是否有任何其他库可以让我滑动菜单和滑动菜单中的标签?不确定是否可以使用android-menudrawer

编辑:想要实现以下。即,菜单中的选项卡
单击菜单按钮时,会打开菜单片段,在Menufragment 内我想添加选项卡。

  

【问题讨论】:

    标签: android actionbarsherlock slidingdrawer slidingmenu


    【解决方案1】:

    编辑:

    我想把这个设计当作一个挑战,看看结果如何:

    正如我在 cmets 中所建议的,我使用了PagerSlidingTabStripViewPager

    我没有包含ActionBarSherlock,但如果需要,这将很容易修改:MainActivity 将需要从SherlockFragmentActivity 扩展,并将主题@style/Theme.Sherlock.Light 添加到清单文件中,即全部。

    (为了确保您明白这一点,PagerSlidingTabStrip 是在底部创建选项卡的人)

    以下是我将 PagerSlidingTabStrip 和 ViewPager 与 SlidingMenu 集成的步骤:

    1 - 将 SlidingMenu 库导入 Eclipse 工作区
    2 - 将 PagerSlidingTabStrip 库导入 Eclipse 工作区
    3 - 将 Android 支持库添加到您的项目中(并将相同的 .jar 复制到 SlidingMenu 和 PagerSlidingTabString 库中,否则 eclipse 可能会抱怨)
    4 - MainActivity 的最小示例:

    public class MainActivity extends FragmentActivity  {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            SlidingMenu menu = new SlidingMenu(this);
            menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
            menu.setBehindOffset(50);
            menu.setFadeDegree(0.35f);
            menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);
            menu.setMenu(R.layout.left_menu);
    
            ViewPager pager = (ViewPager) findViewById(R.id.pager);
            pager.setAdapter(new ViewPagerAdapter(getSupportFragmentManager()));
    
            PagerSlidingTabStrip tabs = (PagerSlidingTabStrip) findViewById(R.id.tabs);
            tabs.setViewPager(pager);
        }
    }
    

    5 - 滑动菜单布局,R.layout.left_menu:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/left_menu"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#CCC"
        android:orientation="vertical" xmlns:app="http://schemas.android.com/apk/res/org.grec">
    
        <com.astuetz.viewpager.extensions.PagerSlidingTabStrip
            android:id="@+id/tabs"
            app:shouldExpand="true"
            android:layout_width="match_parent"
            android:layout_alignParentBottom="true"
            android:layout_height="48dip" />
    
        <android.support.v4.view.ViewPager
            android:id="@+id/pager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_above="@id/tabs" />
    
    </RelativeLayout>
    

    6 - ViewPagerAdapter:

    public class ViewPagerAdapter extends FragmentStatePagerAdapter {
    
        private final int PAGES = 3;
        private String[] titles={"Tab 1", "Tab 2", "Tab 3"};
    
        public ViewPagerAdapter(FragmentManager fm) {
            super(fm);
        }
    
        @Override
        public Fragment getItem(int position) {
            switch (position) {
                case 0:
                    return new TabFragment1();
                case 1:
                    return new TabFragment2();
                case 2:
                    return new TabFragment3();
                default:
                    throw new IllegalArgumentException("The item position should be less or equal to:" + PAGES);
            }
        }
    
        @Override
        public CharSequence getPageTitle(int position) {
            return titles[position];
        }
    
        @Override
        public int getCount() {
            return PAGES;
        }
    }
    

    7 - 还有一个片段示例,TabFragment1.java(其他 2 个类似):

    public class TabFragment1 extends Fragment {
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            return inflater.inflate(R.layout.fragment_tab_1, container, false);
        }
    }
    

    8 - 片段R.layout.fragment_tab_1 的布局非常简单,它包含一个TextView,所以我不会在这里包含它。

    我希望这个示例能解决您的问题,并帮助您走上正确的道路。

    github上的完整源代码:https://github.com/vgrec/SlidingMenuWithViewpager

    【讨论】:

    • 这一行带来 menuFragment .replace(R.id.menu_frame, new SampleListFragment()) 但我需要menuActivity。仍然没有运气。 :(
    • 嗯...“带来 menuFragment”是什么意思。哪个 menuFragment?
    • 从侧面出现的菜单是一个片段,我需要用Activiy替换菜单。 new SampleListFragment() 不能用活动替换,因为没有 API,但是只能使用 FragmentActivity 而不是 JUST Fragments 创建选项卡。 所以,....我的问题又来了。尝试将new SampleListFragment() 替换为new SampleListActivity(),如果成功,请告诉我如何操作。
    • 写博客的好主意,今天晚些时候我会放在博客上并将源代码上传到github。
    • 你可以在github上找到例子:github.com/vgrec/SlidingMenuWithViewpager
    【解决方案2】:

    1) 将 SherlockActionBar 库添加到 SlidingMenu

    2) 将SlidingFragmentActivity extends FragmentActivity 更改为SlidingFragmentActivity extends SherlockFragmentActivity

    3)然后将SlidingMenu库添加到您的项目中,您的项目应该使用MyProjectActivity extends SlidingFragmentActivity



    您可以使用 SherlockActionBar 创建带有标签的滑动菜单 这里是使用视图寻呼机创建选项卡的示例代码 对于滑动,您可以查看他们的文档

    public static class TabsAdapter extends FragmentPagerAdapter implements ActionBar.TabListener, ViewPager.OnPageChangeListener {
        private final Context mContext;
        private final ActionBar mActionBar;
        private final ViewPager mViewPager;
        private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
    
        static final class TabInfo {
            private final Class<?> clss;
            private final Bundle args;
    
            TabInfo(Class<?> _class, Bundle _args) {
                clss = _class;
                args = _args;
            }
        }
    
        public TabsAdapter(SherlockFragmentActivity activity, ViewPager pager) {
            super(activity.getSupportFragmentManager());
            mContext = activity;
            mActionBar = activity.getSupportActionBar();
            mViewPager = pager;
            mViewPager.setAdapter(this);
            mViewPager.setOnPageChangeListener(this);
        }
    
        public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) {
            TabInfo info = new TabInfo(clss, args);
            tab.setTag(info);
            tab.setTabListener(this);
            mTabs.add(info);
            mActionBar.addTab(tab);
            notifyDataSetChanged();
        }
    
        @Override
        public int getCount() {
            return mTabs.size();
        }
    
        @Override
        public Fragment getItem(int position) {
            TabInfo info = mTabs.get(position);
            return Fragment.instantiate(mContext, info.clss.getName(), info.args);
        }
    
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        }
    
        @Override
        public void onPageSelected(int position) {
            mActionBar.setSelectedNavigationItem(position);
        }
    
        @Override
        public void onPageScrollStateChanged(int state) {
        }
    
        public void onTabSelected(Tab tab, FragmentTransaction ft) {
            Object tag = tab.getTag();
            for (int i = 0; i < mTabs.size(); i++) {
                if (mTabs.get(i) == tag) {
                    mViewPager.setCurrentItem(i);
                }
            }
        }
    
        @Override
        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        }
    
        @Override
        public void onTabReselected(Tab tab, FragmentTransaction ft) {
        }
    }
    



        mViewPager = new ViewPager(this);
        mViewPager.setId(R.id.pager);
    
        setContentView(mViewPager);
        ab.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    
        mTabsAdapter = new TabsAdapter(this, mViewPager);
    
        mTabsAdapter.addTab(ab.newTab().setText("tab1"), FirstFragment.class, null);
        mTabsAdapter.addTab(ab.newTab().setText("tab2"), SecondFragment.class, null);
        mTabsAdapter.addTab(ab.newTab().setText("tab3"), ThirdFragment.class, null);
    

    【讨论】:

    • 感谢您的努力,这是标签的代码。它扩展了FragmentPagerAdapter 我需要使用 Fragment 或SherlockFragment 来达到同样的效果,绝对没有别的。由于 SlidingMenu 仅支持 Fragments。
    【解决方案3】:

    正如您所说,SlidingMenu 使用fragments,并且您希望在菜单中包含选项卡。对我来说,在菜单中使用选项卡需要嵌套片段,这意味着您不能使用SherlockFragmentActivity,因为它就像Main Activity。片段中不能包含Activity

    我还没有实现这种方法,但也许你可以尝试在片段中实现 TabListener。

    我将此代码用于我的活动而不是片段,

    class MainActivity extends SherlockFragmentActivity implements ActionBar.TabListener
    {
    }
    

    也许你可以拥有,

     class FragmentA extends SherlockFragment implements TabListener{
        @Override
        public void onTabSelected(Tab tab, FragmentTransaction ft) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void onTabReselected(Tab tab, FragmentTransaction ft) {
            // TODO Auto-generated method stub
    
        }
    
    }
    

    【讨论】:

    • 你是对的。,MainActivity 类扩展SherlockFragmentActivity,我想在菜单中扩展相同的内容,但这是不可能的,我正在寻找一种解决方法来将选项卡带入菜单。我已经更新了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 2012-12-16
    • 1970-01-01
    相关资源
    最近更新 更多