相关文章:

1、《Fragment详解之一——概述》
2、《Fragment详解之二——基本使用方法》
3、《Fragment详解之三——管理Fragment(1)》
4、《Fragment详解之四——管理Fragment(2)》
5、《Fragment详解之五——Fragment间参数传递》
6、《Fragment详解之六——如何监听fragment中的回退事件与怎样保存fragment状态》

前面给大家稍微看了要怎么使用fragment,在上篇中,我们也初步接触到了add,replace这些fragment操作的函数,下面就再详细讲讲如何管理Fragment页面吧。

一、概述

1、FragmentManager

要管理activity中的fragments,你就需要使用FragmentManager。通过getFragmentManager()或getSupportFragmentManager()获得 
常用的方法有:

  1. manager.findFragmentById();  //根据ID来找到对应的Fragment实例,主要用在静态添加fragment的布局中,因为静态添加的fragment才会有ID
  2. manager.findFragmentByTag();//根据TAG找到对应的Fragment实例,主要用于在动态添加的fragment中,根据TAG来找到fragment实例
  3. manager.getFragments();//获取所有被ADD进Activity中的Fragment

2、FragmentTransaction

一般用来对当前的Fragment进行管理,包括add,replace,remove;
常用的针对Fragment的方法有:

  1. //将一个fragment实例添加到Activity的最上层
  2. add(int containerViewId, Fragment fragment, String tag);
  3. //将一个fragment实例从Activity的fragment队列中删除
  4. remove(Fragment fragment);
  5. //替换containerViewId中的fragment实例,注意,它首先把containerViewId中所有fragment删除,然后再add进去当前的fragment
  6. replace(int containerViewId, Fragment fragment);

还有hide()、show()、detach()、attach()这些函数,我们下篇再讲,这节先对Fragment的用法有一个初步了解;

二、add()、replace()、remove()使用方法示例

下面就通过例子来看看以上几个函数的使用方法吧。 
效果图如下:

  • 点击“ADD Fragment1”,在将Fragment1添加到Activity的container中;
  • 点击“ADD Fragment2”,将Fragment2添加到Activity的container中;
  • 点击“Remove Fragment2”,将Fragment2的实例从container中移除,移除之后,就显示出其下方的fragment1的视图出来了。
  • 再点击”replace Fragment1”,将container中的视图移除,然后添加上fragment2的视图。

那现在我们从头开始构建这个工程:

1、新建两个fragment1.xml 和 fragment2.xml:

从效果图中也可以看出,这两个XML什么都没有,只是通过背景色和文字来区别当前是哪个Fragment的XML布局文件而已,他们的布局代码如下:

fragment1.xml:

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent"
  4. android:background="#ff00f0"
  5. android:orientation="vertical" >
  6. <TextView
  7. android:layout_width="wrap_content"
  8. android:layout_height="wrap_content"
  9. android:text="This is fragment 1"
  10. android:textColor="#000000"
  11. android:textSize="25sp" />
  12. </LinearLayout>

fragment2.xml:

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent"
  4. android:background="#ffff00"
  5. android:orientation="vertical" >
  6. <TextView
  7. android:id="@+id/fragment2_tv"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:text="This is fragment 2"
  11. android:textColor="#000000"
  12. android:textSize="25sp" />
  13. </LinearLayout>

2、建立对应的Fragment类:Fragment1和Fragment2

Fragment1:

  1. import android.os.Bundle;
  2. import android.support.v4.app.Fragment;
  3. import android.view.LayoutInflater;
  4. import android.view.View;
  5. import android.view.ViewGroup;
  6. public class Fragment1 extends Fragment {
  7. @Override
  8. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  9. Bundle savedInstanceState) {
  10. return inflater.inflate(R.layout.fragment1, container, false);
  11. }
  12. }

与上一篇一样,也只是在onCreateView()时返回对应的布局。同样,Fragment2的定义如下:

  1. import android.os.Bundle;
  2. import android.support.v4.app.Fragment;
  3. import android.view.LayoutInflater;
  4. import android.view.View;
  5. import android.view.ViewGroup;
  6. public class Fragment2 extends Fragment {
  7. @Override
  8. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  9. Bundle savedInstanceState) {
  10. return inflater.inflate(R.layout.fragment2, container, false);
  11. }
  12. }

3、MainActivity的布局

从上面的的效果图中也可以看出大概的布局,首先是三个Button,最下方是一个FrameLayout布局,它是用来做为container动态盛装fragment的;它就像是一个占位符,你设置多大,它其中的fragment就最大能有多大。记住,fragment也是Activity中的一个普通控件而已,只不过它可以像Activity一样用于显示的同时还能用来盛装其它控件!作为fragment的容器,即可以用FrameLayout也可以用LinearLayout或者RelativeLayout,都是一样的。activity_main.xml的布局代码如下:

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent"
  4. android:orientation="vertical">
  5. <Button
  6. android:id="@+id/btn_add_frag1"
  7. android:layout_width="match_parent"
  8. android:layout_height="wrap_content"
  9. android:text="ADD  Fragment1" />
  10. <Button
  11. android:id="@+id/btn_add_frag2"
  12. android:layout_width="match_parent"
  13. android:layout_height="wrap_content"
  14. android:text="ADD  Fragment2" />
  15. <Button
  16. android:id="@+id/btn_remove_frag2"
  17. android:layout_width="match_parent"
  18. android:layout_height="wrap_content"
  19. android:text="Remove  Fragment2" />
  20. <Button
  21. android:id="@+id/btn_repalce_frag1"
  22. android:layout_width="match_parent"
  23. android:layout_height="wrap_content"
  24. android:text="replace  Fragment1" />
  25. <FrameLayout
  26. android:id="@+id/fragment_container"
  27. android:layout_width="match_parent"
  28. android:layout_height="match_parent"/>
  29. </LinearLayout>

4、MainActivity的实现:

(1)首先,先写一个添加fragment到Activity中的函数:

  1. private void addFragment(Fragment fragment, String tag) {
  2. FragmentManager manager = getSupportFragmentManager();
  3. FragmentTransaction transaction = manager.beginTransaction();
  4. transaction.add(R.id.fragment_container, fragment, tag);
  5. transaction.commit();
  6. }
  • 先是传进来两个参数,一个是要添加的fragment实例,另一个是一个TAG
  • 至于FragmentManager、FragmentTransaction就没什么好讲的,这是这么个流程,要获取它们的实例就得调用这些函数。
  • 然后是add(R.id.fragment_container, fragment, tag)函数:第一个参数是要将fragment盛装的container,即我们上面的FrameLayout!第三个参数是tag,当传进去这个TAG,它就会跟这个fragment关联起来,当我们通过findFragmentByTag()时,根据这个TAG就能找到这个Fragment实例。进而对它进行操作,比如,我们下面的remove();
  • 在通过transaction对Fragment操作完以后,一定要记得调用transaction.commit(),这样才会将操作提交到系统中,这里的代码才会最终起作用。

有没有觉得这个流程挺像数据库的回滚操作!对,其实就是这样的,这里其实就是一个针对Fragment的回滚操作,首先通过beginTransaction()来定义回滚的开始,然后通过transaction对Fragment进行一系列操作(我们这里只是进行了ADD,其实可以做一串操作),等操作完了利用commit()提交。这里就先初步讲到这,下节会细讲有关transaction的回滚过程。
(2)添加Fragment1和Fragment2:
好了,上面我们写好了一个函数addFragment(Fragment fragment, String tag),下面我们就要通过这个函数来添加Fragment1和Fragment2的实例了。
当点击“ADD Fragment1”按钮时:

  1. Fragment1 fragment1 = new Fragment1();
  2. addFragment(fragment1, "fragment1");

当点击“ADD Fragment2”按钮时:

  1. Fragment2 fragment2 = new Fragment2();
  2. addFragment(fragment2, "fragment2");

这里需要注意的是,当我们添加每个Fragment实例时,都传进去一个对应的TAG,fragment1对应的是“fragment1”,fragment2对应的是“fragment2”,通过这些TAG,我们就可以通过findFragmentByTag()来获取它们了。
(3)RemoveFragment2:
下面就是当点击“RemoveFragment2”按钮时的代码操作了:

  1. private void removeFragment2() {
  2. FragmentManager manager = getSupportFragmentManager();
  3. Fragment fragment = manager.findFragmentByTag("fragment2");
  4. FragmentTransaction transaction = manager.beginTransaction();
  5. transaction.remove(fragment);
  6. transaction.commit();
  7. }

首先是通过

  1. Fragment fragment = manager.findFragmentByTag("fragment2");

找到我们当时ADD进Activity的fragment2实例,然后通过transaction.remove(fragment);将它删除;从效果图中可以看到,由于我们移除了fragment2的实例,而又由于fragment2是在界面最上方的,所以把它删除了之后,自然就剩下了fragment1在最上方了,所以我们就看到了fragment1的界面。那如果我们移除的是fragment1呢?答案是界面没有任何变化!因为fragment1的实例是在fragment2的下方的,我们是根本看不到它的。
(4)ReplaceFragment1:

最后一个操作:ReplaceFragment1:

咱们先回到上面的RemoveFragment2操作,在RemoveFragment2之后,要知道我们的Activity的ADD队列中,就只有fragment1了。知道这一点之后,咱们看下面ReplaceFragment1的代码:

  1. private void replaceFragment1() {
  2. FragmentManager manager = getSupportFragmentManager();
  3. Fragment2 fragment2 = new Fragment2();
  4. FragmentTransaction transaction = manager.beginTransaction();
  5. transaction.replace(R.id.fragment_container, fragment2);
  6. transaction.commit();
  7. }

这里有个注意的问题:

  1. transaction.replace(R.id.fragment_container, fragment2);

这里replace传进去的第一个参数是容器ID,第二个参数是要新增的fragment。既然要replace(),那它是针对哪个fragment进行replace()呢?怎么没有指定要替换的fragment!为什么这里的第一个参数是盛装Activity中所有Fragment的container的ID呢?没错,这里的replace操作会把这个cotainer中所有fragment清空!!!!然后再把fragment2添加进去!
从上面的的讲解,大家可能也已经觉查到FragmentTransaction的Add()操作是维持着一个队列的,在这个队列中,根据ADD进去的先后顺序形成了一个链表,我们上面的操作在这个列表中的形式变化如下图所示:

源码在文章最底部给出

到这里add,replace,remove的使用方法就讲完了,但这里有个问题,必须根大家讲一下:我们上面说过replace操作会把container中的所有fragment全部删除,然后再将指定的fragment添加进去!但Android在实现时出现了BUG!在replace()时,并不能把以前所有Fragment清空,就因为这个系统工程产了BUG就会导致add()和Replace()不能共用!关于add()和Replace()不能共用的问题,我们会在下篇再讲。下面先给大家说说有关回滚的问题。

三、有关回滚——FragmentTransaction

1、FragmentTransaction事务回滚使用方法:

上部分,我们讲了有关添加、删除Fragment的操作,想将上一次commit的操作返回时,要怎么做呢。这就需要FragmentTransaction的回滚功能了。 
要使用回滚功能,只需要要使用下面两个代码: 
在transaction.commit()之前,使用addToBackStack()将其添加到回退栈中。

  1. transaction.addToBackStack(String tag);

在需要回退时,使用popBackStack()将最上层的操作弹出回退栈。

  1. manager.popBackStack();

这里的popBackStack()是弹出默认的最上层的栈顶内容。
当栈中有多层时,我们可以根据id或TAG标识来指定弹出到的操作所在层。函数如下:

  1. void popBackStack(int id, int flags);
  2. void popBackStack(String name, int flags);

其中

  • 参数int id是当提交变更时transaction.commit()的返回值。
  • 参数string name是transaction.addToBackStack(String tag)中的tag值;
  • 至于int flags有两个取值:0或FragmentManager.POP_BACK_STACK_INCLUSIVE;
  • 当取值0时,表示除了参数一指定这一层之上的所有层都退出栈,指定的这一层为栈顶层;
  • 当取值POP_BACK_STACK_INCLUSIVE时,表示连着参数一指定的这一层一起退出栈;
  • 除了这几个函数,还有下面几个函数:有关他们的使用,我们在这小部分结尾时会提到
  1. popBackStackImmediate()
  2. popBackStackImmediate(String tag)
  3. popBackStackImmediate(String tag, int flag)
  4. popBackStackImmediate(int id, int flag)

下面我们就通过一个例子来讲解一下有关回退栈中的操作过程:

先看下效果图:

整体流程是这样的:
1、逐个将Fragment1,2,3,4添加到窗口中,在添加时,每添加一个Fragment要利用transaction的addToBackStack将此次操作加入到回退栈中。
2、然后点击"PopBackStack"方法,将栈顶最上层的操作回退。退将最后一次添加回退出来,显示Fragment3.
3、点击“ADD Fragment4”将栈还原到1,2,3,4依次ADD进栈的状态,即操作1完成后的栈状态,然后点击“BackToStack2_0”,其实调用的方法是:

  1. manager.popBackStack("fragment2",0);//方法一,通过TAG回退

从这里可以看出,要回退到添加ADD Fragment2的状态,注意最后一个参数,这里设为0,表明,要回退ADD Fragment2的之后的操作,将ADD Fragment2的操作置为栈顶。从效果图中也可以看出,点击后的视图在Fragment2的位置
4、最后仍然是先点击"Add Fragment3"和"ADD Fragment4",将栈还原到操作1完成后的栈状态。然后点击“BackToStack2_INCLUSIVE”;其调用的方法是:

  1. manager.popBackStack("fragment2",FragmentManager.POP_BACK_STACK_INCLUSIVE);//方法一,通过TAG回退

这里与上面的主要不同点在于第二个参数,这里设置为POP_BACK_STACK_INCLUSIVE,即在出栈时连带ADD Fragment2的操作一块出栈,放在栈顶的是ADD Fragment1的操作,所以放在界面上就是显示的是Fragment1的视图。
下面我们看看具体实现:
(1)、首先,与上部分一样,先添加四个Fragment,并用背景色和文字来区分。这部分代码我们就不讲了。
主要看看点击按钮的代码处理方法。
(2)、首先是添加Fragment1:

  1. Fragment1 fragment1 = new Fragment1();
  2. stackID1 = addFragment(fragment1,"fragment1");

其中:

  1. private int stackID1,stackID2,stackID3,stackID4;
  1. private int addFragment(Fragment fragment,String stackName){
  2. FragmentManager manager = getSupportFragmentManager();
  3. FragmentTransaction transaction = manager.beginTransaction();
  4. transaction.add(R.id.fragment_container,fragment);
  5. transaction.addToBackStack(stackName);
  6. return transaction.commit();
  7. }

首先,这里的stackID1,stackID2,stackID3,stackID4是用来保存每次commit()后返回的Transaction的ID值。在void popBackStack(int id, int flags);时,其中的参数id就是这个值
然后在每次ADD操作后,利用addToBackStack(string name)将每次ADD操作添加进回退栈中;
同样,添加Fragment2的代码如下,添加Fragment3,Fragment4的方法同理

  1. Fragment2 fragment2 = new Fragment2();
  2. stackID2 = addFragment(fragment2,"fragment2");

(3)、然后是回退栈顶内容:

  1. private void popBackStack(){
  2. FragmentManager manager = getSupportFragmentManager();
  3. manager.popBackStack();
  4. }

(4)、接着是点击BackToFrag2_0按钮的内容,这里有两种方法实现,一种是指定TAG,一种是利用Commit()返回的ID

  1. private void popBackStackToFrag2_0(){
  2. FragmentManager manager = getSupportFragmentManager();
  3. manager.popBackStack("fragment2",0);//方法一,通过TAG回退
  4. // manager.popBackStack(stackID2,0);//方法二,通过Transaction ID回退
  5. }

(5)、最后是点击BackToFrag2_INCLUSIVE按钮的代码:

  1. private void popBackStackToFrag2_Inclusive(){
  2. FragmentManager manager = getSupportFragmentManager();
  3. manager.popBackStack("fragment2",FragmentManager.POP_BACK_STACK_INCLUSIVE);//方法一,通过TAG回退
  4. // manager.popBackStack(stackID2,FragmentManager.POP_BACK_STACK_INCLUSIVE);//方法二,通过Transaction ID回退
  5. }

好了,到这里,有关回滚的基本使用就结束了,需要要注意的是:
使用popBackStack()来弹出栈内容的话,调用该方法后会将事物操作插入到FragmentManager的操作队列,只有当轮询到该事物时才能执行。如果想立即执行事物的话,需要使用下面几个对应的方法:

  1. popBackStackImmediate()
  2. popBackStackImmediate(String tag)
  3. popBackStackImmediate(String tag, int flag)
  4. popBackStackImmediate(int id, int flag)

2、回退栈(back stack)状态改变监听

FragmentManager还为我们提供了监控回退栈状态改变的方法:

  1. FragmentManager::addOnBackStackChangedListener(listener);//添加监听器
  2. FragmentManager::removeOnBackStackChangedListener(listener);//移除监听器

通过添加监听器,就可以在回退栈内容改变时,及时收到通知;
我们在上面代码的基础上,在MainAcitivy中为FragmentManager添加一个监听器,当回退栈状态改变时,打出一个LOG。具体实现如下:
(1)、OnCreate()中:
为fragmentManger添加一个监听器:

  1. FragmentManager manager = getSupportFragmentManager();
  2. listener = new FragmentManager.OnBackStackChangedListener() {
  3. @Override
  4. public void onBackStackChanged() {
  5. // TODO Auto-generated method stub
  6. Log.d("qijian","backstack changed");
  7. }
  8. };
  9. manager.addOnBackStackChangedListener(listener);

(2)、当onDestory()中将监听器remove掉:

  1. protected void onDestroy() {
  2. // TODO Auto-generated method stub
  3. super.onDestroy();
  4. FragmentManager manager = getSupportFragmentManager();
  5. manager.removeOnBackStackChangedListener(listener);
  6. }

大家一定要注意,不管是这里的回退栈的监听还是其它的监听器,在页面对应的销毁时,都要记得remove掉,不然会造成页面不释放,这也是造成OOM的问题之一。

这样当回退栈内容出现变动时,变会打LOG出来,如图:

源码在文章底部给出

3、Transaction事务回退的原则

这里我们着重讲一下,回退是以commit()提交的一次事务为单位的,而不是以其中的add,replace等等操作为单位回退的,即,如果我们在一次提交是添加了fragment2,fragment3,fragment4,那么回退时,会依据添加时的顺序,将它们一个个删除,返回到没有添加fragment4,fragment3,fragment2的状态。
下面我们仍然写一个例子来讲明一下事务的回退原则,效果图如下:

  • 1、首先,添加Fragment1,提交一次事务
  • 2、然后,一次添加Fragment2,Fragment3,Fragment4,然后提交一次事务
  • 3、利用popBackStack()将顶层事务出栈,可以看到把Fragment2,Fragment3,Fragment4一次出栈,界面显示在了Fragment1的位置,这就充分说明了,回滚是以提交的事务为单位进行的!

下面是代码实现部分:
1、同样,新建四个Fragment,分别利用背景色和文字来表明之间的不同。
2、然后添加Fragment1的代码如下:

  1. private void addFragment1() {
  2. Fragment1 fragment1 = new Fragment1();
  3. FragmentManager manager = getSupportFragmentManager();
  4. FragmentTransaction transaction = manager.beginTransaction();
  5. transaction.add(R.id.fragment_container, fragment1);
  6. transaction.addToBackStack("fragment1");
  7. transaction.commit();
  8. }

3、然后是添加其它三个Fragment的代码如下:

  1. private void addOtherFragments() {
  2. Fragment2 fragment2 = new Fragment2();
  3. Fragment3 fragment3 = new Fragment3();
  4. Fragment4 fragment4 = new Fragment4();
  5. FragmentManager manager = getSupportFragmentManager();
  6. FragmentTransaction transaction = manager.beginTransaction();
  7. transaction.add(R.id.fragment_container, fragment2);
  8. transaction.add(R.id.fragment_container, fragment3);
  9. transaction.add(R.id.fragment_container, fragment4);
  10. transaction.addToBackStack("other fragments");
  11. transaction.commit();
  12. }

再一次重申,从代码中也可以看到,是依次将Fragment2、Fragment3、Fragment4加入容器之后,再提交一次事务,所以下面回滚时,会将他们反顺序的依次删除。即remove(fragment4)、remove(fragment3)、remove(fragment2)
4、点击popBackStack按钮时的代码

  1. private void popBackStack() {
  2. FragmentManager manager = getSupportFragmentManager();
  3. manager.popBackStack();
  4. }

好了,到这里这篇文章就结束了,这篇文章太TM长了……大家估计看得也快要吐了……知识点太多,又想能给大家讲的浅显易懂就只有拉长篇幅了……

源码中有三个工程:
1、《harvicBlog3_1》:对应第二部分:add()、replace()、remove()使用方法示例
2、《harvicBlog3_2》:对应第三部分《有关回滚——FragmentTransaction》中的:FragmentTransaction事务回滚使用方法和回退栈内容监听部分
3、《harvicBlog3_3》:对应第三部分《有关回滚——FragmentTransaction》中的:Transaction事务回退的原则部分

如果本文有帮到你,记得加关注哦

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

请大家尊重原创者版权,转载请标明出处:http://blog.csdn.net/harvic880925/article/details/44927375, 谢谢!

Fragment详解之三——管理Fragment(1)的更多相关文章

  1. (转)android Fragments详解四:管理fragment

    要管理fragment们,需使用FragmentManager,要获取它,需在activity中调用方法getFragmentManager(). 你可以用FragmentManager来做以上事情: ...

  2. Android Fragment详解(二):Fragment创建及其生命周期

    Fragments的生命周期 每一个fragments 都有自己的一套生命周期回调方法和处理自己的用户输入事件. 对应生命周期可参考下图: 创建片元(Creating a Fragment) To c ...

  3. Android Fragment详解(五):Fragment与Activity通讯

    与activity通讯 尽管fragment的实现是独立于activity的,可以被用于多个activity,但是每个activity所包含的是同一个fragment的不同的实例. Fragment可 ...

  4. fragment详解(官方文档)

    原作者为: 苍山.感谢他分享的内容,现在分享出来给eoeAndroid的各位同胞. 详情参考http://www.eoeandroid.com/thread-71642-1-1.html和http:/ ...

  5. [推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆)

    原文:[推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆) [推荐]ORACLE PL/SQL编程详解之三: PL/SQL流程控制语句(不给规则,不成方圆) ...

  6. day09 详解内存管理机制

    """ 今日内容:详解内存管理 1.引用计数 在内存中为了对变量的值进行标记从而方便管理,采用引用计数的方式对变量进行标记. (1)如果变量的值被引用一次,那么该变量的引 ...

  7. AOP详解之三-创建AOP代理后记,创建AOP代理

    AOP详解之三-创建AOP代理后记,创建AOP代理. 上篇文章已经获取到了AOP的信息,接下来就是拿着这些AOP的信息去创建代理了. 首先我们看下创建AOP代理的入口处. //这个方法将返回代理类 p ...

  8. Android Fragment详解(四):管理Fragment

    要管理fragment们,需使用FragmentManager,要获取它,需在activity中调用方法getFragmentManager(). 你可以用FragmentManager来做以上事情: ...

  9. Android面试收集录4 Fragment详解

    1.什么是Fragment? 你可以简单的理解为,Fragment是显示在Activity中的Activity. 它可以显示在Activity中,然后它也可以显示出一些内容. 因为它拥有自己的生命周期 ...

随机推荐

  1. 数学软件 之 基于MATLAB的DFP算法

    DFP算法是本科数学系中最优化方法的知识,也是无约束最优化方法中非常重要的两个拟Newton算法之一,上一周写了一周的数学软件课程论文,姑且将DFP算法的实现细节贴出来分享给学弟学妹参考吧,由于博客不 ...

  2. 20. javacript高级程序设计-JSON

    1. JSON JSON是一种数据格式,存在以下三种类型的值: l 简单值:使用与JavaScript相同的语法,可以在JSON中表示字符串.数值.布尔值和null,不支持 undefined,例如: ...

  3. Django~学习计划

    20160302 Excel,PDF 处理 GeoDjango学习:GIS编程,百度地图 Javascript 邮件系统 图像处理

  4. nyoj925_国王的烦恼_并查集

    国王的烦恼 时间限制:3000 ms  |  内存限制:65535 KB 难度:2   描述 C国由n个小岛组成,为了方便小岛之间联络,C国在小岛间建立了m座大桥,每座大桥连接两座小岛.两个小岛间可能 ...

  5. python if __name__ == '__main__'解析

    废话不多说,正题: python中所有的模块都有一个内置属性 __name__,一个模块的 __name__ 的值取决于如何应用模块.如果 import 一个模块,那么模块__name__ 的值通常为 ...

  6. storyboard pushViewController 的时候,新的界面黑屏

    storyboard 创建的一级界面需要通过代码跳转到另一 storyboard 创建的界面的时候,通常我们会这样 其实 alloc init 相当于重新创建一个界面,所以我们 push 进入之后会发 ...

  7. 让UserControl能显示焦点状态

    'set the control can display the focus status Protected Overrides Sub OnGotFocus(ByVal e As System.E ...

  8. Union函数

    . 共用体声明和共用体变量定义 共用体(参考“共用体”百科词条)是一种特殊形式的变量,使用关键字union来定义 共用体(有些人也叫"联合")声明和共用体变量定义与结构体十分相似. ...

  9. 1 mysql的安装

    win10 总之前期的步骤大概有:1下载安装:2 安装好后配置环境变量:3:登陆数据库 1:安装 mysql有安装版和直接解压就可以用的,据说大神都是安装的直接解压的,但鉴于自己是小白,就整了个安装版 ...

  10. sql中union和union all的用法

    如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字.union(或称为联合)的作用是将多个结果合并在一起显示出来. union和unio ...