传统的方式来实现这个结构,需要用到很多Activity,我们这里只用一个Activity,其余的全部采用Fragment来实现。通过代码可以看出来fragment是相当灵活的,比起Activity的实现方式,显然具有优势。
实现代码
首先我们的MainActivity的代码需要一个fragment,布局代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@null"
android:fitsSystemWindows="true"
android:orientation="vertical">
<include layout="@layout/layout_main_header" />
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1.0"
android:background="@color/background_color" />
<include layout="@layout/layout_main_footer" />
</LinearLayout>
- 1
注意这里的footer和header,这里可用来实现下面的播放栏和标题栏。
中间的FrameLayout进行嵌套,完成其余所有的UI界面。
MainActivity代码如下:
public class MainActivity extends FragmentActivity {
private static final String TAG = MainActivity.class.getSimpleName();
private static final String FRAGMENT_TAGS = "fragmentTags";
private static final String CURR_INDEX = "currIndex";
private static int currIndex = 0;
private RadioGroup group;
private ArrayList<String> fragmentTags;
private FragmentManager fragmentManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AppManager.getAppManager().addActivity(this);
setContentView(R.layout.activity_main);
fragmentManager = getSupportFragmentManager();
if (savedInstanceState == null){
initData();
initView();
}
}
private void initData() {
currIndex = 0;
fragmentTags = new ArrayList<>(Arrays.asList("HomeFragment", "ContactFragment", "DiscoveryFragment"));
}
private void initView() {
group = (RadioGroup)findViewById(R.id.group);
group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.foot_bar_work:
currIndex = 0;
break;
case R.id.foot_bar_contact:
currIndex = 1;
break;
case R.id.foot_bar_discover:
currIndex = 2;
break;
default:
break;
}
showFragment();
}
});
showFragment();
}
private void showFragment() {
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment fragment = fragmentManager.findFragmentByTag(fragmentTags.get(currIndex));
if (fragment == null){
fragment = instantFragment(currIndex);
}
for (int i = 0;i < fragmentTags.size();i++){
Fragment f = fragmentManager.findFragmentByTag(fragmentTags.get(i));
if (f != null && f.isAdded()){
fragmentTransaction.hide(f);
}
}
if (fragment.isAdded()){
fragmentTransaction.show(fragment);
}else {
fragmentTransaction.add(R.id.fragment_container,fragment,fragmentTags.get(currIndex));
}
fragmentTransaction.commitAllowingStateLoss();
fragmentManager.executePendingTransactions();
}
/*
*这里用于实现三个一级菜单的选择:
*MainPageFragment包含三个二级菜单
*DiscoveryFragment的三个二级菜单栏的实现类似
*/
private Fragment instantFragment(int currIndex) {
switch (currIndex){
case 0:return new MainPagerFragment();
case 1:return new LocalFragment();
case 2:return new DiscoveryFragment();
default:return new MainPagerFragment();
}
}
@Override
protected void onDestroy(){
super.onDestroy();
AppManager.getAppManager().finishActivity(this);
}
}
- 1
这里的代码整个不是很难,相信大家都能很轻易的看明白。这里我们就不加赘述了。
下面我们给出MainPageFragment的布局代码和Java代码
布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--横向滑动的容器-->
<com.kiplening.fragment.ui.PagerSlidingTabStrip
android:id="@+id/horizontal_info"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:scrollbars="none"/>
<android.support.v4.view.ViewPager
android:id="@+id/info_viewpager"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</LinearLayout>
- 1
横向滑动容器用于展示tab栏。
Java代码:
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
mView = inflater.inflate(R.layout.fragment_home_pager,null);
pager = (ViewPager) mView.findViewById(R.id.info_viewpager);
tabs = (PagerSlidingTabStrip)mView.findViewById(R.id.horizontal_info);
return mView;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
FragmentPagerAdapter adapter = new NewsAdapter(getChildFragmentManager());
pager.setAdapter(adapter);
final int pageMargin = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 4, getResources().getDisplayMetrics());
pager.setPageMargin(pageMargin);
tabs.setViewPager(pager);
}
class NewsAdapter extends FragmentPagerAdapter{
public NewsAdapter(FragmentManager fm){
super(fm);
}
/*
*这部分代码实现的是二级菜单栏的选择
*/
@Override
public Fragment getItem(int position) {
if (position == 0) {
return new TaskListFragment();
//return new MessageBoxFragment();
}
if (position == 1) {
return new MessageBoxFragment();
}
return new OthersFragment();
}
- 1
整体来说,代码量都不大,还需要最后一层的fragment来实现二级菜单栏的内容。就是一个简单的fragment,可以随意实现。我们就来个最简单的hello world
/**
* Created by Kipleningon 3/1/2016.
*/
public class MessageBoxFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.test,null);
return view;
}
}
- 1
布局文件相信就不用贴出来了吧!
总结
我搞这个也断断续续弄了好几天才弄出来,现在回过头来看,还是想要把整个框架和结构先搞清楚;然后,了解一下用到的各个组件的基本性质;最后再来动手实践,这样会顺利很多。
首先弄清楚自己要做的是什么,整个的框架是怎样的,了解需要用到的组件。