Android之 Fragment

什么是Fragment:

Android是在Android 3.0 (API level 11)开始引入Fragment的。

可以把Fragment想成Activity中的模块,这个模块有自己的布局,有自己的生命周期,单独处理自己的输入,在Activity运行的时候可以加载或者移除Fragment模块。

可以把Fragment设计成可以在多个Activity中复用的模块。

当开发的应用程序同时适用于平板电脑和手机时,可以利用Fragment实现灵活的布局,改善用户体验。

 

 

Fragment的意义:

 Android在3.0中引入了fragments的概念,主要目的是用在大屏幕设备上--例如平板电脑上,支持更加动态和灵活的UI设计。平板电脑的屏幕要比手机的大得多,有更多的空间来放更多的UI组件,并且这些组件之间会产生更多的交互。Fragment允许这样的一种设计,而不需要你亲自来管理 viewhierarchy的复杂变化。 通过将activity的布局分散到fragment中, 你可以在运行时修改activity的外观,并在由activity管理的back stack中保存那些变化.  

例如, 一个新闻应用可以在屏幕左侧使用一个fragment来展示一个文章的列表,然后在屏幕右侧使用另一个fragment来展示一篇文章--2个fragment并排显示在相同的一个activity中,并且每一个fragment拥有它自己的一套生命周期回调方法,并且处理它们自己的用户输入事件。 因此, 取代使用一个activity来选择一篇文章而另一个activity来阅读文章的方式,用户可以在同一个activity中选择一篇文章并且阅读, 如图所示:

 

fragment在你的应用中应当是一个模块化和可重用的组件.即,因为fragment定义了它自己的布局, 以及通过使用它自己的生命周期回调方法定义了它自己的行为,你可以将fragment包含到多个activity中. 这点特别重要, 因为这允许你将你的用户体验适配到不同的屏幕尺寸.举个例子,你可能会仅当在屏幕尺寸足够大时,在一个activity中包含多个fragment,并且,当不属于这种情况时,会启动另一个单独的,使用不同fragment的activity.

继续之前那个新闻的例子 -- 当运行在一个特别大的屏幕时(例如平板电脑),应用可以在Activity A中嵌入2个fragment。然而,在一个正常尺寸的屏幕(例如手机)上,没有足够的空间同时供2个fragment用, 因此, Activity A会仅包含文章列表的fragment, 而当用户选择一篇文章时, 它会启动ActivityB,它包含阅读文章的fragment.因此, 应用可以同时支持上图中的2种设计模式。

 

 

Fragment的生命周期:

因为Fragment必须嵌入在Acitivity中使用,所以Fragment的生命周期和它所在的Activity是密切相关的。

如果Activity是暂停状态,其中所有的Fragment都是暂停状态;如果Activity是stopped状态,这个Activity中所有的Fragment都不能被启动;如果Activity被销毁,那么它其中的所有Fragment都会被销毁。(对Activity不熟悉的话,请看另一篇文章《Android四大组件之Activity》)

但是,当Activity在活动状态,可以独立控制Fragment的状态,比如加上或者移除Fragment。

当这样进行fragment transaction(转换)的时候,可以把fragment放入Activity的back stack中,这样用户就可以进行返回操作。

 

 

Fragment的使用:

创建Fragment

要创建一个fragment, 必须创建一个 Fragment 的子类 (或者继承自一个已存在的它的子类DialogFragment,ListFragment,PreferenceFragment,WebViewFragment). Fragment类的代码看起来很像 Activity 。它包含了和activity类似的回调方法, 例如onCreate()、 onStart()、onPause()以及 onStop()。事实上, 如果你准备将一个现成的Android应用转换到使用fragment,可能只需简单的将代码从你的activity的回调方法分别移动到你的fragment的回调方法即可。

      通常, 应当至少实现如下的生命周期方法:

  • onCreate()
    当创建fragment时, 系统调用该方法. 
    在实现代码中,应当初始化想要在fragment中保持的必要组件, 当fragment被暂停或者停止后可以恢复.
  • onCreateView()
    fragment第一次绘制它的用户界面的时候, 系统会调用此方法. 为了绘制fragment的UI,此方法必须返回一个View, 这个view是你的fragment布局的根view. 如果fragment不提供UI, 可以返回null.
  • onPause()
    用户将要离开fragment时,系统调用这个方法作为第一个指示(然而它不总是意味着fragment将被销毁.) 在当前用户会话结束之前,通常应当在这里提交任何应该持久化的变化(因为用户有可能不会返回).

 

大多数应用应当为每一个fragment实现至少这3个方法,但是还有一些其他回调方法你也应当用来去处理fragment生命周期的各种阶段.全部的生命周期回调方法将会在后面章节 Handlingthe Fragment Lifecycle 中讨论.

      除了继承基类 Fragment , 还有一些子类你可能会继承:

 

    • DialogFragment
      显示一个浮动的对话框.  
      用这个类来创建一个对话框,是使用在Activity类的对话框工具方法之外的一个好的选择,
      因为你可以将一个fragment对话框合并到activity管理的fragment back stack中,允许用户返回到一个之前曾被摒弃的fragment.
    • ListFragment
      显示一个由一个adapter(例如 SimpleCursorAdapter)管理的项目的列表, 类似于ListActivity.
      它提供一些方法来管理一个list view, 例如 onListItemClick()回调来处理点击事件.
    • PreferenceFragment
      显示一个 Preference对象的层次结构的列表, 类似于PreferenceActivity. 
      这在为你的应用创建一个"设置"activity时有用处.

 

实现Fragment的UI

  提供Fragment的UI,必须实现onCreateView()方法。

  假设Fragment的布局设置写在example_fragment.xml资源文件中,那么onCreateView()方法可以如下写:

public static class ExampleFragment extends Fragment
{@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState){// Inflate the layout for this fragmentreturn inflater.inflate(R.layout.example_fragment, container, false);}
}

onCreateView()中container参数代表该Fragment在Activity中的父控件;savedInstanceState提供了上一个实例的数据。

  inflate()方法的三个参数:

  第一个是resource ID,指明了当前的Fragment对应的资源文件;

  第二个参数是父容器控件;

  第三个布尔值参数表明是否连接该布局和其父容器控件,在这里的情况设置为false,因为系统已经插入了这个布局到父控件,设置为true将会产生多余的一个View Group。

 

把Fragment加入Activity

 

  当Fragment被加入Activity中时,它会处在对应的View Group中。

 

  Fragment有两种加载方式:一种是在Activity的layout中使用标签<fragment>声明;另一种方法是在代码中把它加入到一个指定的ViewGroup中。

 

  另外,Fragment它可以并不是Activity布局中的任何一部分,它可以是一个不可见的部分。这部分内容先略过。

 

 

 

加载方式1:通过Activity的布局文件将Fragment加入Activity

 

  在Activity的布局文件中,将Fragment作为一个子标签加入即可。

 

  如:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="match_parent"><fragment android:name="com.example.news.ArticleListFragment"android:id="@+id/list"android:layout_weight="1"android:layout_width="0dp"android:layout_height="match_parent" /><fragment android:name="com.example.news.ArticleReaderFragment"android:id="@+id/viewer"android:layout_weight="2"android:layout_width="0dp"android:layout_height="match_parent" />
</LinearLayout>

其中android:name属性填上你自己创建的fragment的完整类名。

  当系统创建这个Activity的布局文件时,系统会实例化每一个fragment,并且调用它们的onCreateView()方法,来获得相应fragment的布局,并将返回值插入fragment标签所在的地方。

  有三种方法为Fragment提供ID:

  android:id属性:唯一的id

  android:tag属性:唯一的字符串

  如果上面两个都没提供,系统使用容器view的ID。

 

加载方式2:通过编程的方式将Fragment加入到一个ViewGroup中

  当Activity处于Running状态下的时候,可以在Activity的布局中动态地加入Fragment,只需要指定加入这个Fragment的父View Group即可。

  首先,需要一个FragmentTransaction实例: 

FragmentManager fragmentManager = getFragmentManager()FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

  (注,如果import android.support.v4.app.FragmentManager;那么使用的是:FragmentManager fragmentManager = getSupportFragmentManager();)

  之后,用add()方法加上Fragment的对象:

ExampleFragment fragment = new ExampleFragment();fragmentTransaction.add(R.id.fragment_container, fragment);fragmentTransaction.commit();

  其中第一个参数是这个fragment的容器,即父控件组。

  最后需要调用commit()方法使得FragmentTransaction实例的改变生效。

 

Fragment对menu菜单的操作

android4.0之后引入了fragment的概念,它的生命周期函数和activity几乎一样。对菜单的操作也是通过onCreateOptionMenu()实现的。

fragment可以通过实现 onCreateOptionMenu() 提供菜单项给activity的选项菜单。为了使这个方法接收调用,无论如何, 你必须在 onCreate() 期间调用 setHasOptionsMenu() 来指出fragment愿意添加item到选项菜单(否则, fragment将接收不到对 onCreateOptionsMenu()的调用)
随后从fragment添加到Option菜单的任何项,都会被 追加到现有菜单项的后面.当一个菜单项被选择, fragment也会接收到 对 onOptionsItemSelected() 的回调.也可以在你的fragment layout中通过调用 registerForContextMenu() 注册一个view来提供一个环境菜单.当用户打开环境菜单, fragment接收到一个对 onCreateContextMenu() 的调用.当用户选择一个项目, fragment接收到一个对onContextItemSelected() 的调用。
注意: 尽管你的fragment会接收到它所添加的每一个菜单项被选择后的回调,  但实际上当用户选择一个菜单项时, activity会首先接收到对应的回调.如果activity的on-item-selected回调函数实现并没有处理被选中的项目, 然后事件才会被传递到fragment的回调。

例子:

onCreate() 期间调用 setHasOptionsMenu() 来指出fragment愿意添加item到选项菜单

public static class DetailsFragment extends Fragment {@Overridepublic void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setHasOptionsMenu(true);}
}

操作菜单

 @Overridepublic void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {// TODO Auto-generated method stubsuper.onCreateOptionsMenu(menu, inflater);menu.add("Menu 1a").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);menu.add("Menu 1b").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// TODO Auto-generated method stubToast.makeText(getActivity(), "index is"+getShownIndex()+" && menu text is "+item.getTitle(), 1000).show();return super.onOptionsItemSelected(item);}

 

 

还记得文章上面提到过的阅读新闻的例子吗?(讲Fragment意义那里)下面,我就来实现这个功能:

我们先贴出效果图:

(竖屏)

       点击第二条新闻后,如下图:

 

(横屏状态)

 

下面贴上代码:

 先要创建两个布局文件,一个用于横屏、一个用于竖屏:

 其代码分别为:

layout/main.xml:

<?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:orientation="horizontal" ><fragment class="com.topcsa.test_fragment.ListFragment"android:id="@+id/titles"android:layout_weight="1"android:layout_width="0px"android:layout_height="match_parent"/></LinearLayout>

layout-land/main.xml:

<?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:orientation="horizontal" ><fragment class="com.topcsa.test_fragment.ListFragment"android:id="@+id/titles"android:layout_weight="1"android:layout_width="0px"android:layout_height="match_parent"/><FrameLayout android:id="@+id/detail"android:layout_weight="2"android:layout_width="0px"android:layout_height="match_parent"android:background="?android:attr/detailsElementBackground"></FrameLayout></LinearLayout>

 

包下的文件如下:

下面依次贴上代码(代码有详细注释):

 

package com.topcsa.test_fragment;public final class Data {public static final String[] titles = { "日本买两栖舰欲圆航母梦 最后得鸡肋","中将:中国坦克兵素质优异 96A凸显四大质量问题", "台湾政坛又炸锅:与大陆首席谈判代表是“共谍”" };public static final String[] DETAIL = {"日本防卫相小野寺五典8月4日在东京都发表演讲又一次强调了两栖攻击舰的重要性,指出日本将从美国购买黄蜂级两栖攻击舰。若发展顺利,新型两栖攻击舰将于2019年服役日本海上自卫队,成为其最大舰艇。","首先,这主要是一场坦克乘员素质的比赛,比技能、比体能、比心理素质。应该说中国坦克兵表现堪称完美。射击比赛第一,除了装备因素外,娴熟的操作技能和全车乘员协调一致的动作,是获胜的关键。装备性能可以提供高命中率的客观条件,但在高速行进中(在视频中看,96A坦克行进间射击的时速应在20-25千米/小时)能发发命中目标,则主要取决于人的因素。而T-72坦克行进间射击时速都不超过10千米/小时,甚至是短停射击,差距就大了。96A坦克上反式稳像火控的反应速度、精度和在复杂工况条件的稳定性,大大超过了T-72下反式火控。96坦克初期型号也是下反式稳像火控,远不至于在这次比赛中T-72坦克表现得这么差,这就是坦克乘员的素质在起作用了。只能说中国坦克兵的素质高于国外同行。另外,我军坦克兵射击训练的难度大大超过了这次竞赛条件。譬如射击跑道是起伏的、弯曲的,目标间夹角不小于17密位(这次比赛也就1-2密位),打完一个目标后需要大角度、高速度调炮瞄向下一个目标;目标不仅是隐显的,还是隐蔽的,周围不能有明显方位物(这次比赛在靶标附近设立了一个独立家屋,便于搜索和指示目标);96A坦克在训练中以打运动目标为主,目标时速不低于12千米/小时(这次目标是固定的,目标色彩与背景反差也较大),如果换成运动目标,估计T-72坦克脱靶的更多。装备也是重要因素。在视频中看到,T-72坦克弹迹和弹着点都能看到,说明它的炮口初速不大于1000米/秒,而96A坦克根本看不到弹迹,弹着点烟尘也小很多,贯穿布靶时形成一个小洞,说明我炮口初速和钨芯脱壳穿甲弹的侵彻力远高于T-72坦克。我命中部位大多进入目标9区(井字格,四周8个区,中心为9区),说明我坦克炮千米立靶密集度集中,精度高、弹道稳定。","两岸发展关系,台湾的政治稳定至关重要。台湾社会很多人或许没有意识到,台湾政治的一些深层无序已经相当严重。大陆与世界很多经济体谈自贸区或类似协定,但唯有同台湾的这一份冒出遭学生抗议并搁置的离奇周折,张显耀也是第一位被疑遭大陆“策反”的首席谈判代表。", };
}
View Code

 

package com.topcsa.test_fragment;import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ScrollView;
import android.widget.TextView;public class DetailFragment extends Fragment {public static DetailFragment newInstance(int index){DetailFragment f=new DetailFragment();Bundle bundle=new Bundle();bundle.putInt("index", index);f.setArguments(bundle);//将bundle对象作为Fragment的参数保存return f;}public int getShownIndex(){//获取要显示的列表项索引return getArguments().getInt("index",0);}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {if(container==null){return null;}//创建一个滚动视图ScrollView sl=new ScrollView(getActivity());TextView text=new TextView(getActivity());text.setPadding(10, 10, 10, 10);sl.addView(text);//设置文本框中要显示的文本
        text.setText(Data.DETAIL[getShownIndex()]);return sl;}
}
View Code

 

package com.topcsa.test_fragment;import android.app.Fragment;
import android.app.FragmentTransaction;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;public class ListFragment extends android.app.ListFragment {boolean dualPane;// 是否在同一界面上显示列表和内容int curCheckPosition = 0;// 当前选择的索引位置
@Overridepublic void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);//为列表设置适配器setListAdapter(new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_checked, Data.titles));//获取布局文件中添加的帧布局管理器View detailFrame=getActivity().findViewById(R.id.detail);//判断是否在一屏上同时显示列表和详细内容dualPane=detailFrame!=null&&detailFrame.getVisibility()==View.VISIBLE;if(savedInstanceState!=null){//更新当前的索引位置curCheckPosition=savedInstanceState.getInt("curChoice",0);}if(dualPane){//设置列表为单选模式
            getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);showDetails(curCheckPosition);//显示详细内容
        }}//该方法在STOP()之前执行,用于保存当前选中项的列表项的索引值
    @Overridepublic void onSaveInstanceState(Bundle outState) {// TODO Auto-generated method stubsuper.onSaveInstanceState(outState);outState.putInt("curChoice", curCheckPosition);}@Overridepublic void onListItemClick(ListView l, View v, int position, long id) {// TODO Auto-generated method stubshowDetails(position);//显示详细内容
    }private void showDetails(int index) {curCheckPosition=index;if(dualPane){getListView().setItemChecked(index, true);//设置选中状态//获取用于显示详细信息的FragmentDetailFragment df=(DetailFragment) getFragmentManager().findFragmentById(R.id.detail);if(df==null||df.getShownIndex()!=index){//创建一个新的DetailFragment实例,用于显示当前选项对应的详细内容df=DetailFragment.newInstance(index);//在Activity中管理fragment,需要使用FragmentManager//获得一个FragmentTransaction实例FragmentTransaction ft=getFragmentManager().beginTransaction();//替换原来显示的详细内容
                ft.replace(R.id.detail, df);//设置转换效果
                ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);ft.commit();//提交事务
            }}else{//竖屏Intent intent=new Intent(getActivity(),MainActivity.DetailActivity.class);intent.putExtra("index", index);startActivity(intent);}}}
View Code

 

package com.topcsa.test_fragment;import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.res.Configuration;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.os.Build;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);}public static class DetailActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);// 判断是否为横屏if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {finish();return;}if (savedInstanceState == null) {//在初始化时,插入一个显示详细内容的Fragment//实例化DetailFragment对象DetailFragment detail = new DetailFragment();//设置传递的参数
                detail.setArguments(getIntent().getExtras());//添加一个显示详细内容的Fragment
                getFragmentManager().beginTransaction().add(android.R.id.content, detail).commit();}}}}
View Code

 

最后,别忘了清单文件的配置:(内部Activity的注册)

<activity android:name="com.topcsa.test_fragment.MainActivity$DetailActivity"android:label="详细内容"></activity>

 

 

 新闻阅读Demo下载:http://download.csdn.net/detail/af74776/7806353

 

 

本文重点参考了的文章(基本上算是大汇总吧):http://blog.csdn.net/lilu_leo/article/details/7671533

                     http://www.cnblogs.com/mengdd/archive/2013/01/08/2851368.html

                     http://www.cnblogs.com/yydcdut/p/3921297.html

转载于:https://www.cnblogs.com/scetopcsa/p/3930733.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/260094.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安卓psp模拟器联机教程_刺激战场国际服下载方法教程!安卓ios模拟器都有

刺激战场国际服不需要VPN&#xff0c;不需要加速器。刺激战场国际服账号可以使用微信登入&#xff0c;进游戏页面点击more就可以了。安卓系统&#xff1a;①下载网易UU加速器&#xff0c;通过网易UU加速器平台直接下载。②有的机型不能通过网易UU下载&#xff0c;但是可以通过Q…

docker pdf 中文版 linux,Docker入门实战手册PDF

一、为什么要使用 Docker&#xff1f;1 、快速交付应用程序• 开发者使用一个标准的image 来构建开发容器&#xff0c;开发完成之后&#xff0c;系统管理员就可以使用这个容器来部署代码• Docker 可以快速创建容器&#xff0c;快速迭代应用程序&#xff0c;并让整个过程可见…

openldap linux客户端,OpenLDAP 客户端安装部署

六、OpenLDAP客户端验证1、配置/etc/openldap/ldap.conf默认客户端不允许查询OpenLDAP条目信息&#xff0c;如果需要让客户端查询条目&#xff0c;需要添加OpenLDAP服务端的URI以及BASE条目&#xff0c;命令如下&#xff1a;2、客户端验证用户的信息添加我已经在上篇博文里面介…

基于.Net Framework 4.0 Web API开发(4):ASP.NET Web APIs 基于令牌TOKEN验证的实现

概述&#xff1a; ASP.NET Web API 的好用使用过的都知道&#xff0c;没有复杂的配置文件&#xff0c;一个简单的ApiController加上需要的Action就能工作。但是在使用API的时候总会遇到跨域请求的问题&#xff0c; 特别各种APP万花齐放的今天&#xff0c;对API使用者身份角色验…

匈牙利命名法为何被淘汰_为何甲烷的习惯命名法用甲烷而不是一烷?

其实在有机化合物中文翻译早期&#xff0c;是有过用数字命名的阶段的&#xff0c;先上图。部分有机化合物在不同时期的汉译名对照那么后来为何未采用数字&#xff0c;而使用天干。与商务印书馆和郑贞文个人其实有很大关系。那么有机物中文命名的演进是怎样的呢&#xff1f;下面…

Windows下Mysql Cluster集群启动脚本与启动服务添加方法

3.2.8 集群启动脚本及启动服务注册 从上面的启动过程我们可以看出&#xff0c;Mysql集群启动命令较复杂&#xff0c;容易造成cmd窗口因误操作关闭而导致的数据库停止&#xff0c;在此我介绍一下如何将这些命令的操作变成windos的服务项&#xff0c;当windos启动时&#xff0…

iOS 本地化应用程序汇总 国际化

最近要做一个应用要实现本地化&#xff0c;因为使用的是xcode4&#xff0c;应用程序本地化的问题跟以前的版本还是有些不同&#xff0c;在网上找了些资料对于xcode4以上的版本资料还是相对较少&#xff0c;有些最后要通过手动创建文件&#xff0c;这样操作实在是太麻烦&#xf…

图卷积神经网络_深度层次化图卷积神经网络

来源&#xff1a;IJCAI 2019论文地址&#xff1a;https://arxiv.org/abs/1902.06667代码地址&#xff1a;https://github.com/CRIPAC-DIG/H-GCNIntroduction1、问题定义&#xff1a;什么是半监督的节点分类&#xff1f;图1 半监督节点分类如图1所示&#xff0c;在标记数据量很少…

老师能提供什么帮助

老师能提供什么帮助&#xff1f; 这篇本来想上周写的&#xff0c;原计划在感恩节推送&#xff0c;可惜太忙&#xff0c;计划赶不上变化。 时隔十年&#xff0c;我又要给计算机系的同学们上课了&#xff0c;心里还是有些小激动的。我下学期要开一门大课叫程序设计与数据结构,涵盖…

12个Icon图标资源网站

1.除了Icon以外&#xff0c;还有很多不错的UI设计素材。 地址&#xff1a;http://worldui.com/2.除了免费Icon资源下载以外&#xff0c;还提供Icon定制的付费服务。地址&#xff1a;http://dryicons.com/3.很喜欢这个icon资源站的展示方式。地址&#xff1a;http://www.icotrip…

linux中解决SSH连接慢问题

2019独角兽企业重金招聘Python工程师标准>>> 现在连接linux服务器一般都是使用SSH远程连接的方式。最近新装了一台服务器&#xff0c;发现telnet时速度很快&#xff0c;ping时一切也正常&#xff0c;但SSH连接的时候却很慢。经过网上资料查询&#xff0c;大致是有以…

阿里云深圳数据中心正式开放

阿里云深圳数据中心正式开放 ​ 8月29日&#xff0c;阿里云深圳数据中心正式开放运营&#xff0c;这是继杭州、青岛、北京、香港之后&#xff0c;我们在全球开放的第五个数据中心。 深圳数据中心主要辐射以深圳、广州为中心的华南区域&#xff0c;以满足这一区域内的商贸企业、…

c语言函数声明定义参数命名,C语言函数声明与定义

C语言函数声明与定义教程在C语言函数声明与定义语法type funcName(paramType1 param1, paramType2 param2){// 执行语句...return val}参数参数描述type函数的返回值类型&#xff0c;如果没有任何返回值&#xff0c;则写 void&#xff0c;不可以死省略不写。funcName函数名。pa…

SNF开发平台WinForm之五-高级查询使用说明-SNF快速开发平台3.3-Spring.Net.Framework

5.1运行效果&#xff1a; 5.2开发实现&#xff1a; 1、按上面效果来说&#xff0c;先来看一下在程序当中如果调用。第一步在页面拖拽一个按钮为“高级查询”&#xff0c;事件上写下如下代码&#xff1a; 如果是单表查询的话&#xff0c;只需要传GridView就行&#xff0c;如果是…

颈椎病防治指南

2019独角兽企业重金招聘Python工程师标准>>> 长期从事财会、写作、打字、办公室等职业的工作人员&#xff0c;由于长期低头伏案工作&#xff0c;使颈椎长时间处于屈曲位或某些特定体位&#xff0c;不仅使颈椎间盘内的压力增高&#xff0c;而且也使颈部肌肉长期处于非…

智能手机计步算法c语言实现,【转载】智能手机计步器算法的实现

现在的智能手机嵌入了一些微小的传感器&#xff0c;比如重力传感器、光传感器、声音传感器等。如何有效地利用这些传感器来开发一些应用&#xff0c;是一个值得深入研究的课题。比如开发医疗健康的应用、运动量监视器等。本文采用htc Touch Pro智能手机的重力传感器来开发一款监…

Arduino教程资料汇总(8月22日悄悄跟新了一下)

http://www.geek-workshop.com/thread-985-1-1.html 本帖最后由 迷你强 于 2013-8-31 12:36 编辑 F-101 arduino基础套件使用资料 Arduino入门教程--课前准备--Arduino驱动安装及1.0 IDE菜单介绍Arduino入门教程--第一课--板载Led闪烁实验Arduino入门教程--第二课--第一次面包板…

HTML5/CSS3系列教程:HTML5 区域(Sectioning)的重要性

日期&#xff1a;2013-2-4 来源&#xff1a;GBin1.com 不管你以前在web页面布局中如何称呼它们 - “区域”还是“块”&#xff0c;我们一直都在布局中将页面分成可视的不同区域。但真正的问题在于我们并没有使用任何正确的工具来实现。一般情况下我们使用典型的网格来划分页头…

CoreAnimation —— CAReplicatorLayer(拷贝图层)

2019独角兽企业重金招聘Python工程师标准>>> CAReplicatorLayer是一个layer容器&#xff0c;会对其中的subLayer进行一些差异处理&#xff08;它的子layer都可以拷贝&#xff09; 属性&#xff1a; //拷贝的次数 property NSInteger instanceCount; //是否开启景深效…

android 接收短信代码,短信接收功能实现的代码

其中包含了widget必备的要素以及对应文件分别为&#xff1a;appwidgetprovider--------------------------SmsWidget.javawidget的config--------------------------SmsWidgetConfig.javawidget引发的app-------------------------SmsAider.javaappwidgetproviderinfo---------…