相关文章:

1、《ViewPager 详解(一)---基本入门》

2、《ViewPager 详解(二)---详解四大函数》

3、《ViewPager 详解(三)---PagerTabStrip与PagerTitleStrip添加标题栏的异同》

4、《ViewPager 详解(四)----自主实现滑动指示条》

5、《ViewPager 详解(五)-----使用Fragment实现ViewPager滑动》

一、PagerTitleStrip

先看个简单的,先上个效果图,吸引大家一下眼球。

三个页面间的滑动,此时是带着上面的标题一块滑动的。

  

看一下android 对于PagerTabStrip的官方解释:

Class Overview


PagerTitleStrip is a non-interactive indicator of the current, next, and previous pages of a ViewPager. It is intended to be used as a child view of a ViewPager widget in your XML layout. Add it as a child of a ViewPager in your layout file and set its android:layout_gravity to TOP or BOTTOM to pin it to the top or bottom of the ViewPager. The title from each page is supplied by the methodgetPageTitle(int) in the adapter supplied to the ViewPager.

For an interactive indicator, see PagerTabStrip.

翻译:

PagerTabStrip是ViewPager的一个关于当前页面、上一个页面和下一个页面的一个非交互的指示器。它经常作为ViewPager控件的一个子控件被被添加在XML布局文件中。在你的布局文件中,将它作为子控件添加在ViewPager中。而且要将它的 android:layout_gravity 属性设置为TOP或BOTTOM来将它显示在ViewPager的顶部或底部。每个页面的标题是通过适配器的getPageTitle(int)函数提供给ViewPager的。

我可能译的不大通顺,这里英文也难度不大,大家应该也能看得懂,但我还是着重讲两点:

1、首先,文中提到:在你的布局文件中,将它作为子控件添加在ViewPager中。

2、第二,标题的获取,是重写适配器的getPageTitle(int)函数来获取的。

根据这两点,我们就可以看代码了:

1、XML布局文件:

[html] view plaincopyprint?
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. tools:context="com.example.testviewpage_2.MainActivity" >
  6. <android.support.v4.view.ViewPager
  7. android:id="@+id/viewpager"
  8. android:layout_width="wrap_content"
  9. android:layout_height="200dip"
  10. android:layout_gravity="center">
  11. <android.support.v4.view.PagerTitleStrip
  12. android:id="@+id/pagertitle"
  13. android:layout_width="wrap_content"
  14. android:layout_height="wrap_content"
  15. android:layout_gravity="top"
  16. />
  17. </android.support.v4.view.ViewPager>
  18. </RelativeLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.example.testviewpage_2.MainActivity" ><android.support.v4.view.ViewPagerandroid:id="@+id/viewpager"android:layout_width="wrap_content"android:layout_height="200dip"android:layout_gravity="center"><android.support.v4.view.PagerTitleStripandroid:id="@+id/pagertitle"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:layout_gravity="top"/></android.support.v4.view.ViewPager></RelativeLayout>

清楚的看到我们将.PagerTitleStrip将其作为ViewPager的子控件直接嵌入其中;这是第一步;当然android:layout_gravity=""的值要设置为top或bottom。将标题栏显示在顶部或底部。

2、重写适配器的getPageTitle()函数

便于大家有个整体认识,先贴全局代码,然后再逐个讲,这段代码是在《ViewPager 详解(二)---详解四大函数》 直接更改来的,如果不太明白,先看看这篇文章。

[java] view plaincopyprint?
  1. package com.example.testviewpage_2;
  2. /**
  3. * @author  harvic
  4. * @date 2014.8.12
  5. */
  6. import java.util.ArrayList;
  7. import java.util.List;
  8. import android.app.Activity;
  9. import android.os.Bundle;
  10. import android.support.v4.view.PagerAdapter;
  11. import android.support.v4.view.PagerTitleStrip;
  12. import android.support.v4.view.ViewPager;
  13. import android.view.LayoutInflater;
  14. import android.view.View;
  15. import android.view.ViewGroup;
  16. public class MainActivity extends Activity {
  17. private View view1, view2, view3;
  18. private List<View> viewList;// view数组
  19. private ViewPager viewPager; // 对应的viewPager
  20. private List<String> titleList;  //标题列表数组
  21. @Override
  22. protected void onCreate(Bundle savedInstanceState) {
  23. super.onCreate(savedInstanceState);
  24. setContentView(R.layout.activity_main);
  25. viewPager = (ViewPager) findViewById(R.id.viewpager);
  26. LayoutInflater inflater = getLayoutInflater();
  27. view1 = inflater.inflate(R.layout.layout1, null);
  28. view2 = inflater.inflate(R.layout.layout2, null);
  29. view3 = inflater.inflate(R.layout.layout3, null);
  30. viewList = new ArrayList<View>();// 将要分页显示的View装入数组中
  31. viewList.add(view1);
  32. viewList.add(view2);
  33. viewList.add(view3);
  34. titleList = new ArrayList<String>();// 每个页面的Title数据
  35. titleList.add("王鹏");
  36. titleList.add("姜语");
  37. titleList.add("结婚");
  38. PagerAdapter pagerAdapter = new PagerAdapter() {
  39. @Override
  40. public boolean isViewFromObject(View arg0, Object arg1) {
  41. // TODO Auto-generated method stub
  42. //根据传来的key,找到view,判断与传来的参数View arg0是不是同一个视图
  43. return arg0 == viewList.get((int)Integer.parseInt(arg1.toString()));
  44. }
  45. @Override
  46. public int getCount() {
  47. // TODO Auto-generated method stub
  48. return viewList.size();
  49. }
  50. @Override
  51. public void destroyItem(ViewGroup container, int position,
  52. Object object) {
  53. // TODO Auto-generated method stub
  54. container.removeView(viewList.get(position));
  55. }
  56. @Override
  57. public Object instantiateItem(ViewGroup container, int position) {
  58. // TODO Auto-generated method stub
  59. container.addView(viewList.get(position));
  60. //把当前新增视图的位置(position)作为Key传过去
  61. return position;
  62. }
  63. @Override
  64. public CharSequence getPageTitle(int position) {
  65. // TODO Auto-generated method stub
  66. return titleList.get(position);
  67. }
  68. };
  69. viewPager.setAdapter(pagerAdapter);
  70. }
  71. }
package com.example.testviewpage_2;
/*** @author  harvic* @date 2014.8.12*/
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.PagerTitleStrip;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;public class MainActivity extends Activity {private View view1, view2, view3;private List<View> viewList;// view数组private ViewPager viewPager; // 对应的viewPagerprivate List<String> titleList;  //标题列表数组@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);viewPager = (ViewPager) findViewById(R.id.viewpager);LayoutInflater inflater = getLayoutInflater();view1 = inflater.inflate(R.layout.layout1, null);view2 = inflater.inflate(R.layout.layout2, null);view3 = inflater.inflate(R.layout.layout3, null);viewList = new ArrayList<View>();// 将要分页显示的View装入数组中viewList.add(view1);viewList.add(view2);viewList.add(view3);titleList = new ArrayList<String>();// 每个页面的Title数据titleList.add("王鹏");titleList.add("姜语");titleList.add("结婚");PagerAdapter pagerAdapter = new PagerAdapter() {@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {// TODO Auto-generated method stub//根据传来的key,找到view,判断与传来的参数View arg0是不是同一个视图return arg0 == viewList.get((int)Integer.parseInt(arg1.toString()));}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn viewList.size();}@Overridepublic void destroyItem(ViewGroup container, int position,Object object) {// TODO Auto-generated method stubcontainer.removeView(viewList.get(position));}@Overridepublic Object instantiateItem(ViewGroup container, int position) {// TODO Auto-generated method stubcontainer.addView(viewList.get(position));//把当前新增视图的位置(position)作为Key传过去return position;}@Overridepublic CharSequence getPageTitle(int position) {// TODO Auto-generated method stubreturn titleList.get(position);}};viewPager.setAdapter(pagerAdapter);}}

相比较《ViewPager 详解(二)---详解四大函数》这里作了一点更改:

1、变量

[java] view plaincopyprint?
  1. private List<String> titleList;  //标题列表数组
private List<String> titleList;  //标题列表数组

申请了一个String数组,用来存储三个页面所对应的标题的

2、初始化

[java] view plaincopyprint?
  1. titleList = new ArrayList<String>();// 每个页面的Title数据
  2. titleList.add("王鹏");
  3. titleList.add("姜语");
  4. titleList.add("结婚");
titleList = new ArrayList<String>();// 每个页面的Title数据
titleList.add("王鹏");
titleList.add("姜语");
titleList.add("结婚");

在初始化阶段增加了这么一段初始化数组的代码。

3、重写CharSequence getPageTitle(int )函数

[java] view plaincopyprint?
  1. @Override
  2. public CharSequence getPageTitle(int position) {
  3. // TODO Auto-generated method stub
  4. return titleList.get(position);
  5. }
@Override
public CharSequence getPageTitle(int position) {// TODO Auto-generated method stubreturn titleList.get(position);
}

根据位置返回当前所对应的标题。

大家可以看到,其实这里仅仅只重写了getPageTitle()函数,将其根据不同的位置返回不同的字符串就可以实现上面的标题栏功能。第一和第二步有关数组和初始化,其实都是这了这一步,其实我们完全可以用下面这个代码来取代它们:

[java] view plaincopyprint?
  1. @Override
  2. public CharSequence getPageTitle(int position) {
  3. // TODO Auto-generated method stub
  4. switch (position) {
  5. case 0:
  6. return "王鹏";
  7. case 1:
  8. return "姜语";
  9. case 2:
  10. return "结婚";
  11. default:
  12. return "";
  13. }
  14. }
@Override
public CharSequence getPageTitle(int position) {// TODO Auto-generated method stubswitch (position) {case 0:return "王鹏";case 1:return "姜语";case 2:return "结婚";default:return "";}
}

这样效果是一样一样的,只是代码不好维护而已。好了,有关PagerTabStrip的问题,我们就先说到这。

二、PagerTabStrip

同样,先看个PagerTabStrip做出来的效果是怎样的。

此例是以《ViewPager 详解(一)---基本入门》为基础,更改而成;

    

可能看不出太大区别,其实这两个实现的效果基本差不多,但有两点不同:

1、PagerTabStrip在当前页面下,会有一个下划线条来提示当前页面的Tab是哪个。

2、PagerTabStrip的Tab是可以点击的,当用户点击某一个Tab时,当前页面就会跳转到这个页面,而PagerTitleStrip则没这个功能。

同样,先看看官方对PagerTabStrip的解释:

Class Overview


PagerTabStrip is an interactive indicator of the current, next, and previous pages of a ViewPager. It is intended to be used as a child view of a ViewPager widget in your XML layout. Add it as a child of a ViewPager in your layout file and set its android:layout_gravity to TOP or BOTTOM to pin it to the top or bottom of the ViewPager. The title from each page is supplied by the methodgetPageTitle(int) in the adapter supplied to the ViewPager.

For a non-interactive indicator, see PagerTitleStrip.

翻译:

PagerTabStrip是ViewPager的一个关于当前页面、上一个页面和下一个页面的一个可交互的指示器。它经常作为ViewPager控件的一个子控件被被添加在XML布局文件中。在你的布局文件中,将它作为子控件添加在ViewPager中。而且要将它的 android:layout_gravity 属性设置为TOP或BOTTOM来将它显示在ViewPager的顶部或底部。每个页面的标题是通过适配器的getPageTitle(int)函数提供给ViewPager的。

可以看到,除了第一句以外的其它句与PagerTitleStrip的解释完全相同。即用法也是相同的。只是PagerTabStrip是可交互的,而PagerTitleStrip是不可交互的区别。对于区别在哪些位置,即是上面的两点(是否可点击与下划线指示条)。


用法与PagerTitleStrip完全相同,即:

1、首先,文中提到:在你的布局文件中,将它作为子控件添加在ViewPager中。

2、第二,标题的获取,是重写适配器的getPageTitle(int)函数来获取的。

看看实例:

1、XML布局

[html] view plaincopyprint?
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. tools:context="com.example.testviewpage_2.MainActivity" >
  6. <android.support.v4.view.ViewPager
  7. android:id="@+id/viewpager"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:layout_gravity="center">
  11. <android.support.v4.view.PagerTabStrip
  12. android:id="@+id/pagertab"
  13. android:layout_width="match_parent"
  14. android:layout_height="wrap_content"
  15. android:layout_gravity="top"/>
  16. </android.support.v4.view.ViewPager>
  17. </RelativeLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.example.testviewpage_2.MainActivity" ><android.support.v4.view.ViewPagerandroid:id="@+id/viewpager"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"><android.support.v4.view.PagerTabStripandroid:id="@+id/pagertab"android:layout_width="match_parent"android:layout_height="wrap_content" android:layout_gravity="top"/></android.support.v4.view.ViewPager></RelativeLayout>

可以看到,同样,是将PagerTabStrip作为ViewPager的一个子控件直接插入其中,当然android:layout_gravity=""的值一样要设置为top或bottom。

2、重写适配器的getPageTitle()函数

全部代码:

[java] view plaincopyprint?
  1. package com.example.testviewpage_2;
  2. /**
  3. * @author  harvic
  4. * @date 2014.8.13
  5. */
  6. import java.util.ArrayList;
  7. import java.util.List;
  8. import android.app.Activity;
  9. import android.os.Bundle;
  10. import android.support.v4.view.PagerAdapter;
  11. import android.support.v4.view.ViewPager;
  12. import android.view.LayoutInflater;
  13. import android.view.View;
  14. import android.view.ViewGroup;
  15. public class MainActivity extends Activity {
  16. private View view1, view2, view3;
  17. private List<View> viewList;// view数组
  18. private ViewPager viewPager; // 对应的viewPager
  19. private List<String> titleList;
  20. @Override
  21. protected void onCreate(Bundle savedInstanceState) {
  22. super.onCreate(savedInstanceState);
  23. setContentView(R.layout.activity_main);
  24. viewPager = (ViewPager) findViewById(R.id.viewpager);
  25. LayoutInflater inflater = getLayoutInflater();
  26. view1 = inflater.inflate(R.layout.layout1, null);
  27. view2 = inflater.inflate(R.layout.layout2, null);
  28. view3 = inflater.inflate(R.layout.layout3, null);
  29. viewList = new ArrayList<View>();// 将要分页显示的View装入数组中
  30. viewList.add(view1);
  31. viewList.add(view2);
  32. viewList.add(view3);
  33. titleList = new ArrayList<String>();// 每个页面的Title数据
  34. titleList.add("王鹏");
  35. titleList.add("姜语");
  36. titleList.add("结婚");
  37. PagerAdapter pagerAdapter = new PagerAdapter() {
  38. @Override
  39. public boolean isViewFromObject(View arg0, Object arg1) {
  40. // TODO Auto-generated method stub
  41. return arg0 == arg1;
  42. }
  43. @Override
  44. public int getCount() {
  45. // TODO Auto-generated method stub
  46. return viewList.size();
  47. }
  48. @Override
  49. public void destroyItem(ViewGroup container, int position,
  50. Object object) {
  51. // TODO Auto-generated method stub
  52. container.removeView(viewList.get(position));
  53. }
  54. @Override
  55. public Object instantiateItem(ViewGroup container, int position) {
  56. // TODO Auto-generated method stub
  57. container.addView(viewList.get(position));
  58. return viewList.get(position);
  59. }
  60. @Override
  61. public CharSequence getPageTitle(int position) {
  62. return titleList.get(position);
  63. }
  64. };
  65. viewPager.setAdapter(pagerAdapter);
  66. }
  67. }
package com.example.testviewpage_2;/*** @author  harvic* @date 2014.8.13*/
import java.util.ArrayList;
import java.util.List;import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;public class MainActivity extends Activity {private View view1, view2, view3;private List<View> viewList;// view数组private ViewPager viewPager; // 对应的viewPagerprivate List<String> titleList;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);viewPager = (ViewPager) findViewById(R.id.viewpager);LayoutInflater inflater = getLayoutInflater();view1 = inflater.inflate(R.layout.layout1, null);view2 = inflater.inflate(R.layout.layout2, null);view3 = inflater.inflate(R.layout.layout3, null);viewList = new ArrayList<View>();// 将要分页显示的View装入数组中viewList.add(view1);viewList.add(view2);viewList.add(view3);titleList = new ArrayList<String>();// 每个页面的Title数据titleList.add("王鹏");titleList.add("姜语");titleList.add("结婚");PagerAdapter pagerAdapter = new PagerAdapter() {@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {// TODO Auto-generated method stubreturn arg0 == arg1;}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn viewList.size();}@Overridepublic void destroyItem(ViewGroup container, int position,Object object) {// TODO Auto-generated method stubcontainer.removeView(viewList.get(position));}@Overridepublic Object instantiateItem(ViewGroup container, int position) {// TODO Auto-generated method stubcontainer.addView(viewList.get(position));return viewList.get(position);}@Overridepublic CharSequence getPageTitle(int position) {return titleList.get(position);}};viewPager.setAdapter(pagerAdapter);}}

这里的代码与PagerTitleStrip的完全相同,就不再讲解了。

就这样,我们就讲完了有关PagerTabStrip的简单使用方法。下面讲一讲PagerTabStrip的扩展。

3、扩展:PagerTabStrip属性更改

在源码中,大家可以看到有个工程叫TestViewPage_PagerTabStrip_extension,运行一下,效果是这样的:

    

在上面两个图中可以看到,我更改了两个地方:

1、下划线颜色,原生是黑色,我变成了绿色;

2、在Tab标题前加了一个图片;

下面说说是如何更改的:

1、更改下划线颜色:

主要靠PagerTabStrip的setTabIndicatorColorResource方法;

代码如下:

[java] view plaincopyprint?
  1. pagerTabStrip = (PagerTabStrip) findViewById(R.id.pagertab);
  2. pagerTabStrip.setTabIndicatorColorResource(R.color.green);
pagerTabStrip = (PagerTabStrip) findViewById(R.id.pagertab);
pagerTabStrip.setTabIndicatorColorResource(R.color.green);

2、添加标题——重写适配器CharSequence getPageTitle(int)方法

在CharSequence getPageTitle(int position)方法返回值是,我们不返回String对象,而采用SpannableStringBuilder来构造了下包含图片的扩展String对像;

具体代码如下,不再细讲,大家可以看看SpannableStringBuilder的使用方法,就可理解了。

[java] view plaincopyprint?
  1. @Override
  2. public CharSequence getPageTitle(int position) {
  3. SpannableStringBuilder ssb = new SpannableStringBuilder("  "+titleList.get(position)); // space added before text
  4. // for
  5. Drawable myDrawable = getResources().getDrawable(
  6. R.drawable.ic_launcher);
  7. myDrawable.setBounds(0, 0, myDrawable.getIntrinsicWidth(),
  8. myDrawable.getIntrinsicHeight());
  9. ImageSpan span = new ImageSpan(myDrawable,
  10. ImageSpan.ALIGN_BASELINE);
  11. ForegroundColorSpan fcs = new ForegroundColorSpan(Color.GREEN);// 字体颜色设置为绿色
  12. ssb.setSpan(span, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);// 设置图标
  13. ssb.setSpan(fcs, 1, ssb.length(),
  14. Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);// 设置字体颜色
  15. ssb.setSpan(new RelativeSizeSpan(1.2f), 1, ssb.length(),
  16. Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
  17. return ssb;
  18. }
@Override
public CharSequence getPageTitle(int position) {SpannableStringBuilder ssb = new SpannableStringBuilder("  "+titleList.get(position)); // space added before text// forDrawable myDrawable = getResources().getDrawable(R.drawable.ic_launcher);myDrawable.setBounds(0, 0, myDrawable.getIntrinsicWidth(),myDrawable.getIntrinsicHeight());ImageSpan span = new ImageSpan(myDrawable,ImageSpan.ALIGN_BASELINE);ForegroundColorSpan fcs = new ForegroundColorSpan(Color.GREEN);// 字体颜色设置为绿色ssb.setSpan(span, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);// 设置图标ssb.setSpan(fcs, 1, ssb.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);// 设置字体颜色ssb.setSpan(new RelativeSizeSpan(1.2f), 1, ssb.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);return ssb;
}

三、总结

通过前面的讲解,我们应该清楚的认识到PagerTabStrip与PagerTitleStrip在添加标题栏的异同,但他们实现的标题栏效果很不好,不能指定一个页面一次显示一个,或者全部显示,而且标题还滑动。所以注定主流的App都没有用这个玩意的。所以这里也只是一个过渡,在开发中,我们也不建议使用这两个东东。

为什么无法改变PagerTabStrip的滑动特性,看这个贴子:《Fixed Tabs with android.support.v4.view.PagerTabStrip or ViewPagerIndicator》

参考文章:

《Android多屏滑动:ViewPager基础使用及PagerTabStrip先天缺陷(附源码)》

《android:修改PagerTabStrip中的背景颜色,标题字体的样式、颜色和图标以及指示条的颜色》

所有源码打包在一起,分为三个:

1、TestViewPage_pagerTitleStrip:pagerTitleStrip实现实例

2、TestViewPage_PagerTabStrip :PagerTabStrip实现实例

3、TestViewPage_PagerTabStrip_extension:PagerTabStrip的扩展实现

源码下载地址:http://download.csdn.net/detail/harvic880925/7747417

ViewPager 详解(三)---PagerTabStrip与PagerTitleStrip添加标题栏的异同相关推荐

  1. ViewPager 详解(五)-----使用Fragment实现ViewPager滑动

    前言:前几篇文章讲解了ViewPager的普通实现方法,但Android官方最推荐的一种实现方法却是使用fragment,下面我们使用fragment来重新实现一下第一篇<ViewPager 详 ...

  2. ViewPager 详解(二)---详解四大函数

    前言:上篇中我们讲解了如何快速实现了一个滑动页面,但问题在于,PageAdapter必须要重写的四个函数,它们都各有什么意义,在上节的函数内部为什么要这么实现,下面我们就结合Android的API说明 ...

  3. ViewPager详解

    ViewPager详解 ViewPager中的主要方法详解 OnPageChangeListener中的三个方法详解 三种适配器的使用及其主要方法详解 ViewPager用于实现页面间的切换. Vie ...

  4. 数据结构--图(Graph)详解(三)

    数据结构–图(Graph)详解(三) 文章目录 数据结构--图(Graph)详解(三) 一.深度优先生成树和广度优先生成树 1.铺垫 2.非连通图的生成森林 3.深度优先生成森林 4.广度优先生成森林 ...

  5. PackageManagerService启动详解(三)之开始初始化阶段流程分析

      PKMS启动详解(三)之BOOT_PROGRESS_PMS_START阶段流程分析 Android PackageManagerService系列博客目录: PKMS启动详解系列博客概要 PKMS ...

  6. DID会固定年份吗_倍分法DID详解 (三):多时点 DID (渐进DID) 的进一步分析

    作者:王昆仑 (天津大学) E-mail: shawn0513@163.com 连享会专题课程:DSGE 模型及应用 连享会 DSGE 专题课程 这是连享会「倍分法(DID)专题推文」系列的第三篇文章 ...

  7. SSH 服务详解 (三)-- 使用 SSH 代理

    SSH 服务详解 (三)-- 使用 SSH 代理 SSH服务详解(一)–Linux SSH 服务器与客户端的安装与启动 SSH服务详解(二)–使用私钥登录 SSH 服务器(免密登录) SSH 服务详解 ...

  8. Unicode编码详解(三):UTF-8编码

    Unicode编码详解(三):UTF-8编码 本文为原创文章,转载请注明出处,或注明转载自"黄邦勇帅(原名:黄勇) 本文是对<C++语法详解>一书相关章节的增补,以增强读者对字符 ...

  9. Android init.rc文件解析过程详解(三)

    Android init.rc文件解析过程详解(三) 三.相关结构体 1.listnode listnode结构体用于建立双向链表,这种结构广泛用于kernel代码中, android源代码中定义了l ...

最新文章

  1. X-Shell远程连接虚拟机
  2. 【C 语言】二级指针作为输入 ( 指针数组 | 将 二级指针 作为函数输入 | 抽象函数业务逻辑 )
  3. loadrunner脚本设计:参数化
  4. 玩转Eclipse--如何使用eclipse可以更好的提高我们的工作效率
  5. Python模拟分析演员之间亲密程度
  6. linux虚拟机网卡无法启动
  7. ssh:could not resolve hostname XXX:Temporary failure in name resolution
  8. python并发编程之多进程
  9. C#中使用Windows API控制阿里旺旺自动登录 的程序源代码
  10. vue如何debugger
  11. PhotoShop永久序列号
  12. 淘宝官方商品详情接口
  13. 计蒜客-蒜头君回家(bfs)
  14. 【毕业设计】基于卷积神经网络的植物花卉识别系统
  15. android客户端框架,最新的一版,通用Android 客户端架构设计,只有你还没看过
  16. android 西班牙_分析西班牙足球联赛(西甲)
  17. 【MFC】CSplitterWnd 重载限定窗口调整范围
  18. 简单对应分析案例《好评数据分析》
  19. 二刷剑指Offer:剑指Offer+LeetCode(全53题)
  20. freemarker导出word文档对图片拉伸或拉长的处理

热门文章

  1. Python进阶6——序列操作
  2. opencv中的threshold()函数(二值化)
  3. 灰度重心法原理与实现
  4. matlab jdbc mysql_Matlab连接MySQL(ODBC及JDBC驱动)
  5. 自动添加端口添加至Windows防火墙脚本
  6. office365为新建账号发送欢迎邮件
  7. tomcat 部署站点时遇到的部分问题以及解决方案
  8. 一句white-space:nowrap解决IE6,IE7下浮动元素不自动换行
  9. 【CCNA考试】2010-06-17-杭州-1000(PASS)
  10. IT运维管理方案 成就企业信息化建设