slidingmenu开源效果

本文将更进一步, 在很多实际的应用场景中我们需要一个更复杂的场景,比如说需要在一个菜单选项中集成多个tab来集中显示信息。这个时候 Viewpager就派上用场了。

本例中我们将通过SlidingMenu + ViewPager+Fragment 实现带TAB的SlidingMenu。先看看具体的效果。

实现步骤跟上一篇大体相同,这里着重说需要修改的地方

首先我们需要添加一个PagerAdapter来自动适配Tab里面的Fragment ,就像ListView中的BaseAdapter差不多,只是需要实现的方法有一些区别。

package com.example.slidingmenuviewpagertest.adapter;  
 
import java.util.List;  
 
import com.example.slidingmenuviewpagertest.entity.ContentBean;  
import com.example.slidingmenuviewpagertest.fragment.TestContentFragment;  
 
import android.support.v4.app.Fragment;  
import android.support.v4.app.FragmentManager;  
import android.support.v4.app.FragmentPagerAdapter;  
 
public class ContentFragmentPagerAdapter extends FragmentPagerAdapter {  
 
 private List<ContentBean> list;  
 public ContentFragmentPagerAdapter(FragmentManager fm) {  
 super(fm);  
    }  
 
 public ContentFragmentPagerAdapter(FragmentManager fm,List<ContentBean> list) {  
 super(fm);  
 this.list = list;  
    }  
 
 @Override 
 public Fragment getItem(int arg0) {  
 
 return TestContentFragment.newInstance(list.get(arg0).getContent());  
 
    }  
 
 @Override 
 public int getCount() {  
 // TODO Auto-generated method stub 
 return list.size();  
    }  
 
 @Override 
 public CharSequence getPageTitle(int position) {  
 // TODO Auto-generated method stub 
 return list.get(position).getTitle();  
    }  
 
}  

然后在首页Fragment 中初始化ViewPager

package com.example.slidingmenuviewpagertest.fragment;  
 
import java.util.ArrayList;  
import java.util.List;  
 
import android.os.Bundle;  
import android.support.v4.app.Fragment;  
import android.support.v4.view.ViewPager;  
import android.view.LayoutInflater;  
import android.view.View;  
import android.view.ViewGroup;  
 
import com.example.slidingmenuviewpagertest.R;  
import com.example.slidingmenuviewpagertest.adapter.ContentFragmentPagerAdapter;  
import com.example.slidingmenuviewpagertest.entity.ContentBean;  
 
public class HomeFragment extends Fragment {  
 
 private ViewPager mViewPager;  
 private static final String[] titles = {"One","Two","Three","Four","Five"};  
 private List<ContentBean> list = new ArrayList<ContentBean>();  
 private ContentFragmentPagerAdapter mAdapter;  
 
 public HomeFragment(){}  
 
 @Override 
 public View onCreateView(LayoutInflater inflater, ViewGroup container,  
            Bundle savedInstanceState) {  
 
        View rootView = inflater.inflate(R.layout.fragment_home, container, false);  
 
        initData();  
        findView(rootView);  
 
 return rootView;  
    }  
 
 private void initData() {  
 
 for(int i=0;i<titles.length;i++){  
 
            ContentBean cb = new ContentBean();  
            cb.setTitle(titles[i]);  
            cb.setContent(titles[i]+"_"+(i+1));  
 
            list.add(cb);  
        }  
    }  
 
 private void findView(View rootView) {  
 
        mViewPager = (ViewPager) rootView.findViewById(R.id.mViewPager);  
        mAdapter = new ContentFragmentPagerAdapter(getActivity().getSupportFragmentManager(),list);  
        mViewPager.setAdapter(mAdapter);  
    }  
 
 @Override 
 public void onStart() {  
 
 if(mAdapter!=null){  
            mAdapter.notifyDataSetChanged();  
        }  
 
 super.onStart();  
    }  
}  

ViewPager中的Fragment

package com.example.slidingmenuviewpagertest.fragment;  
 
import android.os.Bundle;  
import android.support.v4.app.Fragment;  
import android.util.Log;  
import android.view.LayoutInflater;  
import android.view.View;  
import android.view.ViewGroup;  
import android.widget.TextView;  
 
import com.example.slidingmenuviewpagertest.R;  
 
public class TestContentFragment extends Fragment {  
 private static final String TAG = TestContentFragment.class.getSimpleName();  
 private String title = "Hello";  
 
 public static TestContentFragment newInstance(String s) {  
        TestContentFragment newFragment = new TestContentFragment();  
        Bundle bundle = new Bundle();  
        bundle.putString("title", s);  
        newFragment.setArguments(bundle);  
 
 return newFragment;  
 
    }  
 
 @Override 
 public void onCreate(Bundle savedInstanceState) {  
 
        Log.d(TAG, "TestContentFragment-----onCreate");  
        Bundle args = getArguments();  
 if(args!=null){  
            title = args.getString("title");  
        }  
 
 super.onCreate(savedInstanceState);  
    }  
 
 @Override 
 public View onCreateView(LayoutInflater inflater, ViewGroup container,  
            Bundle savedInstanceState) {  
 
         View rootView = inflater.inflate(R.layout.fragment_test_content, container, false);  
 
         findView(rootView);  
 
 return rootView;  
    }  
 
 private void findView(View rootView) {  
 
        TextView txtLabel = (TextView) rootView.findViewById(R.id.txtLabel);  
        txtLabel.setText(title);  
    }  
}  

TestContentFragment 布局文件 fragment_test_content.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
 android:layout_width="match_parent" 
 android:layout_height="match_parent" > 
 
 <TextView 
 android:id="@+id/txtLabel" 
 android:layout_width="wrap_content" 
 android:layout_height="wrap_content" 
 android:layout_centerInParent="true" 
 android:text="Pages View" 
 android:textSize="16dp" /> 
 
 <ImageView 
 android:layout_width="wrap_content" 
 android:layout_height="wrap_content" 
 android:layout_below="@id/txtLabel" 
 android:layout_centerHorizontal="true" 
 android:layout_marginTop="10dp" 
 android:src="@drawable/ic_launcher" /> 
 
</RelativeLayout> 

首页Fragment 布局文件 fragment_home.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
 android:layout_width="match_parent" 
 android:layout_height="match_parent" > 
 
 <android.support.v4.view.ViewPager 
 android:id="@+id/mViewPager" 
 android:layout_width="match_parent" 
 android:layout_height="wrap_content" > 
 
 <android.support.v4.view.PagerTabStrip 
 android:id="@+id/pagertab" 
 android:layout_width="wrap_content" 
 android:layout_height="wrap_content" 
 android:layout_gravity="top"/> 
 
<!--         <android.support.v4.view.PagerTitleStrip 
 android:id="@+id/mPagerTitleStrip" 
 android:layout_width="match_parent" 
 android:layout_height="wrap_content" 
 android:layout_gravity="top" /> --> 
 </android.support.v4.view.ViewPager> 
 
</RelativeLayout> 

主Activity跟之前没有变化

package com.example.slidingmenuviewpagertest;  
 
import android.annotation.SuppressLint;  
import android.os.Bundle;  
import android.support.v4.app.Fragment;  
import android.support.v4.app.FragmentManager;  
import android.support.v4.app.FragmentTransaction;  
import android.util.Log;  
import android.view.Menu;  
import android.view.MenuItem;  
import com.example.slidingmenuviewpagertest.fragment.CommunityFragment;  
import com.example.slidingmenuviewpagertest.fragment.FindPeopleFragment;  
import com.example.slidingmenuviewpagertest.fragment.HomeFragment;  
import com.example.slidingmenuviewpagertest.fragment.MenuFragment;  
import com.example.slidingmenuviewpagertest.fragment.MenuFragment.SLMenuListOnItemClickListener;  
import com.example.slidingmenuviewpagertest.fragment.PagesFragment;  
import com.example.slidingmenuviewpagertest.fragment.PhotosFragment;  
import com.example.slidingmenuviewpagertest.fragment.WhatsHotFragment;  
import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;  
import com.jeremyfeinstein.slidingmenu.lib.app.SlidingFragmentActivity;  
 
public class MainActivity extends SlidingFragmentActivity implements SLMenuListOnItemClickListener{  
 
 private SlidingMenu mSlidingMenu;  
 
 @SuppressLint("NewApi")  
 @Override 
 public void onCreate(Bundle savedInstanceState) {  
 super.onCreate(savedInstanceState);  
 
        setTitle("Home");  
//      setTitle(R.string.sliding_title); 
        setContentView(R.layout.frame_content);  
 
 //set the Behind View 
        setBehindContentView(R.layout.frame_menu);  
 
 // customize the SlidingMenu 
        mSlidingMenu = getSlidingMenu();  
//      mSlidingMenu.setSecondaryMenu(R.layout.frame_menu); 设置右侧菜单的布局文件 
 
//      mSlidingMenu.setShadowWidth(5); 
//      mSlidingMenu.setBehindOffset(100); 
        mSlidingMenu.setShadowDrawable(R.drawable.drawer_shadow);//设置阴影图片 
        mSlidingMenu.setShadowWidthRes(R.dimen.shadow_width); //设置阴影图片的宽度 
        mSlidingMenu.setBehindOffsetRes(R.dimen.slidingmenu_offset); //SlidingMenu划出时主页面显示的剩余宽度 
        mSlidingMenu.setFadeDegree(0.35f);  
 //设置SlidingMenu 的手势模式 
 //TOUCHMODE_FULLSCREEN 全屏模式,在整个content页面中,滑动,可以打开SlidingMenu 
 //TOUCHMODE_MARGIN 边缘模式,在content页面中,如果想打开SlidingMenu,你需要在屏幕边缘滑动才可以打开SlidingMenu 
 //TOUCHMODE_NONE 不能通过手势打开SlidingMenu 
        mSlidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);  
 
 //设置 SlidingMenu 内容 
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();  
        MenuFragment menuFragment = new MenuFragment();  
        fragmentTransaction.replace(R.id.menu, menuFragment);  
        fragmentTransaction.replace(R.id.content, new HomeFragment());  
        fragmentTransaction.commit();  
 
 //使用左上方icon可点,这样在onOptionsItemSelected里面才可以监听到R.id.home 
        getActionBar().setDisplayHomeAsUpEnabled(true);  
    }  
 
 @Override 
 public boolean onCreateOptionsMenu(Menu menu) {  
 // Inflate the menu; this adds items to the action bar if it is present. 
        getMenuInflater().inflate(R.menu.main, menu);  
 return true;  
    }  
 
 @Override 
 public boolean onOptionsItemSelected(MenuItem item) {  
 switch (item.getItemId()) {  
 case android.R.id.home:  
 
            toggle(); //动态判断自动关闭或开启SlidingMenu 
//          getSlidingMenu().showMenu();//显示SlidingMenu 
//          getSlidingMenu().showContent();//显示内容 
 return true;  
        }  
 return super.onOptionsItemSelected(item);  
    }  
 
 @SuppressLint("NewApi")  
 @Override 
 public void selectItem(int position, String title) {  
 // update the main content by replacing fragments   
        Fragment fragment = null;    
 switch (position) {    
 case 0:    
            fragment = new HomeFragment();    
 break;    
 case 1:    
            fragment = new FindPeopleFragment();    
 break;    
 case 2:    
            fragment = new PhotosFragment();    
 break;    
 case 3:    
            fragment = new CommunityFragment();    
 break;    
 case 4:    
            fragment = new PagesFragment();    
 break;    
 case 5:    
            fragment = new WhatsHotFragment();    
 break;    
 default:    
 break;    
        }    
 
 if (fragment != null) {    
            FragmentManager fragmentManager = getSupportFragmentManager();  
            fragmentManager.beginTransaction()    
                    .replace(R.id.content, fragment).commit();    
 // update selected item and title, then close the drawer   
            setTitle(title);  
            mSlidingMenu.showContent();  
        } else {    
 // error in creating fragment   
            Log.e("MainActivity", "Error in creating fragment");    
        }    
    }  
}  

Demo下载地址:http://download.csdn.net/detail/fx_sky/6723771

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏向治洪

RecyclerView 实现gallery画廊效果

1、RecyclerView的基本用法 首先主Activity的布局文件: <RelativeLayout xmlns:android="http://sc...

75050
来自专栏林冠宏的技术文章

一个难倒 3年 android开发经验 " 工程师 " 的 "bug"

  一个关于 imageView 设置 scaleType 的问题。   就在刚才 晚上9 点多的时候,我的一个外包伙伴发一个工程代码我,叫我去看下这样一个"b...

20990
来自专栏james大数据架构

仿优酷Android客户端图片左右滑动(自动滑动)

最终效果: ? 页面布局main.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns...

22970
来自专栏学海无涯

Android开发之GridView实现弹出式选择器

前段时间,写了一个小项目,里面有个界面如下图所示,之前的版本是用Spinner来做,觉得不够拉轰,所以采用GridView做了一个实现,效果还不错,Mark一下...

31450
来自专栏向治洪

ViewFlipper实现多页面切换

1、屏幕切换指的是在同一个Activity内屏幕见的切换,最长见的情况就是在一个FrameLayout内有多个页面,比如一个系统设置页面;一个个性化设置页面。...

239100
来自专栏Android干货

浅谈TabLayout(ViewPager+Tab联动)

488110
来自专栏iOSDevLog

002. 糗事百科 / QiuShiBaiKe [android]

33590
来自专栏Android干货

Android项目实战(二十七):数据交互(信息编辑)填写总结

34770
来自专栏向治洪

仿今日头条滑动评论效果

开发中碰到问题之后实现的,觉得可能有的开发者用的到或则希望独立成一个小功能DEMO,所以就放出来这么一个DEMO。 原本觉得是最后完成后发网站客户端的,可是这样...

26750
来自专栏向治洪

Android ViewDragHelper及移动处理总结

概述 2013年谷歌i/o大会上介绍了两个新的layout: SlidingPaneLayout和DrawerLayout,现在这俩个类被广泛的运用。我们知道在...

33880

扫码关注云+社区

领取腾讯云代金券