如何在SlidingMenu中使用SherlockFragmentActivity?

时间:2013-08-14 08:01:26

标签: android actionbarsherlock slidingdrawer slidingmenu

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

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

来实现

编辑:想要实现以下目标。即菜单中的标签
当单击菜单按钮时,菜单片段打开,在Menufragment内我想添加标签。

This is home screen Menu With Tabs

3 个答案:

答案 0 :(得分:4)

修改

我想把这个设计作为挑战,看看结果是什么:

enter image description here enter image description here

正如我在评论中建议的那样,我使用了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

答案 1 :(得分:1)

1)将SherlockActionBar库添加到SlidingMenu

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

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



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

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

答案 2 :(得分:0)

正如您所说,SlidingMenu使用fragments并且您希望在菜单中包含选项卡。对我来说,使用菜单中的选项卡需要嵌套片段,这意味着您不能使用SherlockFragmentActivity,因为它类似于Main活动。您不能在片段中包含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

    }

}

enter image description here