1

我正在使用SlidingMenu,它使用不同类型的Fragment/SherlockFragment菜单。
我需要SherlockFragmentActivity,因为我在菜单中 使用标签。
如何将SherlockFragmentActivity与 SlidingMenu 一起使用?

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

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

这是主屏幕带标签的菜单

4

3 回答 3

4

编辑:

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

在此处输入图像描述 在此处输入图像描述

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

于 2013-09-06T20:50:51.840 回答
1

1)将 SherlockActionBar 库添加到 SlidingMenu

2)更改SlidingFragmentActivity extends FragmentActivitySlidingFragmentActivity extends SherlockFragmentActivity

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



您可以使用 SherlockActionBar 在里面创建带有标签的滑动菜单 Here sample code to create Tab with view pager 对于滑动,您可以查看他们的文档

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);
于 2013-08-14T08:23:39.240 回答
0

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

    }

}

在此处输入图像描述

于 2013-08-14T11:29:15.863 回答