毛片在线视频观看,一级日韩免费大片,在线网站黄色,澳门在线高清一级毛片

薈聚奇文、博采眾長、見賢思齊
當前位置:公文素材庫 > 計劃總結 > 工作總結 > 達內培訓總結

達內培訓總結

網站:公文素材庫 | 時間:2019-05-27 20:31:26 | 移動端:達內培訓總結

達內培訓總結

我201*年畢業(yè),第一年做的是銷售的工作,做了一年,沒有什么業(yè)績,我逐漸認識到自己的特定不適合做銷售,于是我決定來濟南達內培訓自己比較喜歡的編程,我做這一決定并不是心血來潮,而是經過深思熟慮的。我當初的想法是學完編程就去一家日資企業(yè)工作,期間鍛煉自己的編程能力和外語能力,為以后更好的發(fā)展打下基礎。但剛來達內的時候我心里很沒有底,因為自己以前并沒有接觸過java,只是在大學期間有一點c語言基礎,對于自己能否學好java非常沒有信心。但我覺得,既然自己決定的事就要自己負責,況且每一個高手都從菜鳥走過來的,所以我下決心要好好學。達內的項目經理非常負責,有什么不會的問就可以,即使有時候項目經理也不能解決,我們還可以發(fā)郵件直接詢問授課老師。在頭一個月,我覺得很吃力,有些問題怎么想也搞不懂,弄得我非常焦躁,可是我堅信只要堅持就可以成功,所以遇到不會的問題我會先自己思考,實在想不出就問其他基礎好的同學,就這樣日復一日,我的困惑雖然還有,但自己心里有底了,覺得java可以學好。多謝同學的幫助,我真的認為到這個學校其實學習氛圍才是最重要的,我們遇到問題可以互相討論,沒有人覺得不好意思,通過互幫互助我們學到了很多java編程的捷徑和陷阱,我們每個人都在進步,這種感覺很棒。這種狀態(tài)一直持續(xù)到做項目,項目一開始,我覺得沒有頭緒,思維跟不上老師的步伐,此時我對之前建立起來的自信產生了懷疑,但老師及時開導我們,他說,一開始都會這樣,只要你踏踏實實去做,一步一個腳印,不管做多做少,都是一種進步,我聽老師的話,每一個問題,每一個細節(jié),我都經過獨立思考,期間雖然很痛快,但我漸漸有了自己的頭緒,這使我信心倍增。之后的每一天我都覺得過得好快,經過八天的努力,我也基本把全部項目的功能完成了!自己覺得非常自豪,回想一下,四個月前我還是一無所知的腦殘,現(xiàn)在竟然可以獨立完成當當網這么復雜的項目,我真的覺得自己這四個月沒有虛度,同時也對以后的IT之路充滿自信!真的非常感謝我的同學,老師,項目經理,沒有他們我不可能取得如此的成績。

擴展閱讀:達內Android培訓的技巧歸納

達內IT培訓集團

3.Activity跳轉與布局管理器

3.1.Intent類3.1.1.概述

Intent類,Android的組件間的橋梁。該類負責啟動組件,在組建之間傳遞數(shù)據(jù)。

3.1.2創(chuàng)建Intent對象

方式(1):Intentintent=newInent(起始組件的對象,目標組件類.class);示例:Intentintent=newintent(this,SecondActivity.class);說明:(1)參數(shù)-this:當前Activity類的對象;(2)參數(shù)-SecondActivity.class:目標Activity類.class;(3)Android有四大組件,分別是Activity、Service、ContentProvider和Broadcast。以下僅以Activity組件舉例。方式(2):Intentintent=newIntent();intent.setClass(起始組件的對象,目標組件類.class);方式(3):用上一個Activity傳遞過來的intent對象創(chuàng)建intent對象,也可以看作是獲取上一個Activity傳遞過來的intent對象。Intentintent=getIntent();說明:

getIntent():Activity類的方法,用于獲取上一個Activity傳遞過來的Intent對象的地址。

3.1.3.常用方法

1、putExtra(key,value);作用:以鍵/值對形式在intent對象中保存基本數(shù)據(jù)類型的數(shù)據(jù)。2、putExtra(key,(Serializable)object)作用:若存放的是對象,則要將對象序列化再存放數(shù)據(jù),如上行代碼所示。3、getIntExtra(key,intDefaultValue);作用:獲取存放在intent對象中的鍵名為key的int類型的數(shù)據(jù)。若獲取不到,則賦一個默認值intDefaultValue。

4、getDoubleExtra(key,doubleValue);作用:獲取存放在intent對象中的鍵名為key的double類型的數(shù)據(jù)。若獲取不到,則賦一個默認值longDefaultValue。

5、getLongExtra(name,longDefaultValue);

作用:獲取存放在intent對象中的鍵名為key的long類型的數(shù)據(jù)。若獲取不到,則賦一個默認值longDefaultValue。

6、getCharExtra(key,charDefault);作用:獲取存放在intent對象中的鍵名為key的char類型的數(shù)據(jù)。若獲取不到,則賦一個默認值charDefaultValue。7、getString(key);

達內IT培訓集團

作用:獲取存放在intent對象中的鍵名為key的String類型的數(shù)據(jù)。8、getStringArray(key);作用:獲取存放在intent對象中的鍵名為key的String類型的數(shù)組。9、getxxxArray(key);作用:獲取存放在intent對象中鍵名為key的基本數(shù)據(jù)類型的數(shù)組。10、getSerializableExtra(key);作用:獲取存放在intent對象中鍵名為key的對象。

3.2.Bundle類

3.2.1.概述

Bundle類用于Activity之間的數(shù)據(jù)傳遞,Bundle通過鍵/值對的方式存取數(shù)據(jù)。Intent類中的putExtra方法實質上是將數(shù)據(jù)存放在了Bundle對象中。Intent類將Bundle對象的存取數(shù)據(jù)進行了包裝,簡化了數(shù)據(jù)存取的操作。

3.2.2.常用方法

1、clear();

作用:清除此Bundle中的所有數(shù)據(jù)。2、getString(Stringkey);

作用:返回指定key的字符串

3、putString(Stringkey,Stringvalue);

作用:存放鍵為key的字符串值4、remove(Stringkey);

作用:移除指定key的值5、putxxx(String,xxxvalue);作用:存放基本數(shù)據(jù)類型的數(shù)據(jù),參見Intent.putxxx();6、putSerializable(key,objectValue);作用:存放(序列化之后的)對象。7、putxxxArray(key,arrayValue);作用:存放元素是基本數(shù)據(jù)類型的數(shù)組。

3.3.Context類簡介

3.3.1.概述

Context(上下文)類是Activity類的間接父類。下圖是類繼承圖:

達內IT培訓集團

圖-1

3.3.2.常用方法

publicvoidstartActivity(Intent);

作用:該方法負責按Intent對象的設置啟動目標Activity。該類也常用于保存Activity對象。說明:Activity類重寫了startActivity方法。

3.4.Activity跳轉3.4.1.概述

1、Activity是Android系統(tǒng)的四大組件之一,可以把Activity當成瀏覽器的標簽,相當于空白的網頁,而界面相當于瀏覽器內的網頁。

2、將Activity與界面綁定就相當于在瀏覽器內填寫了相應的網頁。

3、Activity可以跳轉,就相當于在瀏覽器內點擊鏈接后跳轉到另外一個瀏覽器窗口。提示:Activity與瀏覽器一樣,只是一個殼。真正為用戶提供交互的是界面。實際開發(fā)中會經常編寫諸如注冊、登錄之類的應用,就會出現(xiàn)從一個窗口跳轉至另一個窗口的應用。以下介紹Activity跳轉的方法。3.4.2.與跳轉相關的方法1、startActivity(intent);作用:跳轉至目標Activity。

參數(shù)-intent:在該參數(shù)中設置起始Activity和目標Activity。2、startActivityForResult(intent,requestCode);作用:啟動目標Activity,并要求目標Activitiy返回處理結果。

參數(shù)-requestCode:是一個int類型的數(shù)據(jù),該數(shù)據(jù)稱為請求碼,作用是告訴目標Activity啟動的信息。

說明:請求碼用來標識源Activity。3、setResult(intresultCode);

作用:從目標Activity返回到源Activity,并返回int類型的數(shù)據(jù)。

說明:有可能從多個目標Activity返回處理結果至啟動的Activity,因此resultCode標識是從哪個目標Activity返回的。

4、onActivityResult(intrequestCode,intresultCode,Intentdata);

作用:處理從目標Activity返回的結果,其中第一個參數(shù)是本Activity發(fā)送的請求碼,第二個參數(shù)是目標Activity返回的標識碼,作用見上所述。第三個參數(shù)是一個Intent類型的對象,該對象從目標Activity傳遞過來。

達內IT培訓集團

3.4.3.Activity內部切換界面

通過在Activity.onCreate()方法中調用secContentView(resId),改變布局界面的資源索引值resId,達到在同一個Activity中顯示不同的.xml布局界面的效果。

【案例3.1】制作如圖-2所示的效果

項目名稱:exam03_1,包名:com.tarena.exam03_1。項目入口:MainAct.java。

圖-2a

圖-2b當單擊了圖-2a中的按鈕,界面跳轉至圖-2b界面。

步驟1、打開res/layout/main.xml,該文件是圖-2a的布局文件,代碼如下:

步驟2、在res/layout文件夾下創(chuàng)建second.xml文件,該文件是圖-2b的布局文件,代碼如下:

步驟3、打開src/com.tarena.exam03_1包下的Main.java,在onCreate方法中輸入以下代碼:

//在Activity中顯示main.xml界面

達內IT培訓集團

setContentView(R.layout.main);

ButtonbtnOK=(Button)findViewById(R.id.btnOK);btnOK.setOnClickListener(newOnClickListener(){

});

@Override

publicvoidonClick(Viewv){}

//顯示second.xml布局文件

setContentView(R.layout.second);

3.4.4.Activity間跳轉

3.4.4.1.操作步驟

步驟1、創(chuàng)建目標Activity類;

步驟2、創(chuàng)建與目標Activity類配套的XML布局文件,示例代碼:res/layout/second.xml

步驟3、在目標Activity.onCreate()中,編寫設置Activity顯示內容的代碼,示例代碼:

setContentView(R.layout.second);步驟4、創(chuàng)建Intent對象,指明起始Activity的對象和目標Activity.class;步驟5、調用putExtra(key,value)方法存放數(shù)據(jù)。

步驟6、調用startActivity(intent);啟動目標Activity,若是要求目標Activity返回結果,則步驟7、若要求帶返回結果的啟動,則在目標Activity中調用setResult(resultCode)方法,返回結果碼。

步驟8、若要處理目標Activity返回的結果,則在起始Acivity類中要定義onActivityResult(requestCode,resultCode,data)步驟9、在項目清單文件中注冊新增的Activity類,按以下操作:

調用startForResult(intent,requestCode)方法。達內IT培訓集團

此兩行設置.Main為項目的入口輸入紅框內的代碼提示:若想指定某個Activity為項目的啟動Activity(入口),則將上圖中藍框中的代碼移至該類的注冊代碼中。例如,設置SecondAct為啟動的Activity,則將以上代碼改變?yōu)槿缦麓a即可。3.4.4.2.【案例3.2】不帶數(shù)據(jù)和返回結果的Activity跳轉項目名:exam03_2,包名:com.tarena.exam03_2。項目入口:MainAct.java,效果如圖3所示:圖5a圖5b

圖-3a圖-3b

單擊圖-3a的login按鈕,將跳轉至第二個Activity的窗口,如圖-3b所示:

達內IT培訓集團

步驟1、圖-3a的布局文件的代碼參見exam03_2/res/layout/main.xml。此處不再列出。步驟2、圖-3b的布局文件的代碼參見exam03_2/res/layout/second.xml。此處不再列出。步驟3、打開src/com.tarena.exam03_2/MainAct.java,該類是圖-3a的Activity。代碼如下:publicclassMainActextendsActivity{//定義上下文對象的引用privateContextcontext;@Override

publicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);context=this;//存放當前Activity的實例setContentView(R.layout.main);

ButtonbtnLogin=(Button)findViewById(R.id.btnLogin);btnLogin.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){//創(chuàng)建intent對象,設置起始Activity對象context以及目標ActivityIntentintent=newIntent(context,SecondAc.class);startActivity(intent);//啟動目標Activity}});}}

步驟5、打開src/com.tarena.exam04_2/SecondAct.java,該類是圖-3b的Activity類,輸入以下代碼:

//本類是目標Activity類

publicclassSecondActextendsActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);//設置res/layout/second.xml為當前Activity的顯示內容setContentView(R.layout.second);//獲取起始Activity傳遞過來的intentIntentintent=getIntent();}}

3.4.4.3.【案例3.3】帶數(shù)據(jù)的Activity間的跳轉

通過圖-4a輸入用戶名單擊login按鈕,跳轉至圖-4b,并將用戶名傳遞至圖-4b。本案例項目名稱為exam03_3,包名為com.tarena.exam03_3。

達內IT培訓集團

圖-4a圖-4b步驟1、圖-4a的布局文件參見exam03_3項目中的res/layout/main.xml文件。步驟2、圖-4b的布局文件參見exam03_3項目中的res/layout/second.xml文件。

步驟3、打開src/com.tarena.exam03_3/Main.java,該文件是圖-4a的Activity,代碼如下:publicclassMainextendsActivity{@Override

publicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);

finalEditTextetName=(EditText)findViewById(R.id.etName);ButtonbtnLogin=(Button)findViewById(R.id.btnLogin);btnLogin.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){//創(chuàng)建intent對象,設置起始Activity對象context以及目標ActivityIntentintent=newIntent(Main.this,SecondActivity.class);if(etName.getText().length()>0){Bundlebundle=newBundle();//實例化Bundle對象//存放用戶名數(shù)據(jù)bundle.putString("userName",etName.getText().toString());intent.putExtras(bundle);//將bundle存放在intent對象中}startActivity(intent);//啟動目標Activity}});}}

說明:1、第22行在內部匿名類中調用Main類的當前對象,要寫成Main.this。2、第24-28行使用Bundle存儲數(shù)據(jù),再將Bundle對象存放在intent中。也可以按以下方式代替第26、27行:Intent.putExtra(“username”,etName.getText().toString());實際開發(fā)中推薦按以上方式存放數(shù)據(jù),可簡化數(shù)據(jù)存取的步驟。

3.4.4.4.【案例3.4】啟動帶返回結果的Activity

項目名稱:exam03_4,包名:com.tarena.exam03_4。本案例演示啟動帶返回結果的Acivity,并將返回結果顯示在日志窗口中。效果如圖-5a-圖-5e所示:1、單擊圖-5a的login按鈕,啟動LoginAct類(顯示圖-5b)。單擊圖-5b中的login-finish按鈕,

將返回MainAct類(顯示圖-5c),并在圖-5c下方的日志窗口中輸出:returnfromLoginAct。2、單擊圖-5a的regist按鈕,啟動RegistAct類(顯示圖-5d),單擊圖-5d中的regist-return按鈕,

將返回MainAct類(顯示圖-5e),并在圖-5e下方的日志窗口中輸出:returnfromRegistAct提示:

達內IT培訓集團

圖-5a

圖-5b

圖-5c

圖-5d

圖-5e

步驟1、圖-5a的布局文件參見exam03_4項目中的res/layout/main.xml文件。步驟2、圖-5b的布局文件參見exam03_4項目中的res/layout/login.xml文件。步驟3、圖-5d的布局文件參見exam03_4項目中的res/layout/regist.xml文件。

步驟4、打開src/com.tarena.exam03_4/MainAct.java,該類用于管理圖-5a窗口。代碼如下:publicclassMainActextendsActivity{//以下兩個常量表示請求碼publicstaticfinalintREQUEST_CODE_LOGIN=0;publicstaticfinalintREQUEST_CODE_REGIST=1;//以下兩個常量表示返回碼publicstaticfinalintRESULT_CODE_LOGIN=10;publicstaticfinalintRESULT_CODE_REGIST=20;//定義上下文對象的引用privateContextcontext;@Override

達內IT培訓集團

publicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);context=this;//存放當前Activity的實例setContentView(R.layout.main);

finalButtonbtnRegist=(Button)findViewById(R.id.btnRegist);ButtonbtnLogin=(Button)findViewById(R.id.btnLogin);//啟動LoginActivity

btnLogin.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){//創(chuàng)建intent對象,設置起始Activity對象context以及目標ActivityIntentintent=newIntent(context,LoginAct.class);//啟動目標ActivitystartActivityForResult(intent,REQUEST_CODE_LOGIN);}});//啟動RegistActivitybtnRegist.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){Intentintent=newIntent();intent.setClass(context,RegistAct.class);startActivityForResult(intent,REQUEST_CODE_REGIST);}});}

//處理目標Activity返回的結果@OverrideprotectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){super.onActivityResult(requestCode,resultCode,data);if(resultCode==RESULT_CODE_LOGIN){//若返回碼是RESULT_CODE_LOGINLog.i("MainAct","returnfromLoginAct");}elseif(resultCode==RESULT_CODE_REGIST){//若返回碼是RESULT_CODE_REGISTLog.i("MainAct","returnfromRegistActy");}}}

步驟6、在src/com.tarena.exam03_4包下創(chuàng)建RegistAct.java類,該類負責管理圖-5b,代碼如下://本類是目標Activity類

publicclassRegistActextendsActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);//設置res/layout/second.xml為當前Activity的顯示內容setContentView(R.layout.regist);ButtonbtnRegist=(Button)findViewById(R.id.btnReturn);

達內IT培訓集團

}}

說明:btnRegist.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){//返回啟動的Activity并返回結果碼setResult(MainAct.RESULT_CODE_REGIST);finish();//關閉本窗口}});

紅框中第2行返回啟動的Activity(MainAct類),并返回結果碼Main.RESULT_CODE_REGIST。紅框中第3行結束本窗口。3.5.布局管理器3.5.1.RelativeLayout(相對布局)3.5.1.1概述RelativeLayout的特點是控件之間的位置是相對兄弟控件的位置或父容器的位置,因此稱為相對布局。用相對布局可實現(xiàn)比較復雜的布局。3.5.1.2.常用屬性XML屬性gravityLayout_gravity相關方法setGravity(int)圖-6說明內部控件的對齊方式(屬性值見圖7)在父容器布局中的對齊方式(屬性值見圖8)1、gravity屬性值列表Top頂端對齊Bottom底端對齊Left左端對齊Right右端對齊Center居中對齊Center_vertical垂直方向居中Center_horizontal水平方向居中fill_vertical垂直方向填充fill_horizontal水平方向填充圖-72、本布局在父容器內的對齊方式屬性說明(屬性值true:是。false:否)layout_center_horizontal水平方向居中l(wèi)ayout_center_vertical垂直方向居中

達內IT培訓集團layout_centerParent在父容器中居中Layout_alignParentBottom在父容器中底端對齊Layout_alignParentTop在父容器中頂端對齊Layout_alignParentLeft在父容器中左端對齊Layout_alignParentRight在父容器中右端對齊

圖-8

3、控件中與相對布局相關的屬性,如圖-9所示:屬性說明toRightOf位于指定id值的控件的右邊toLeftOf位于指定id值的控件的左邊above位于指定id值的控件的上邊below位于指定id值的控件的下邊layout_alignTop與指定id值的控件上端對齊layout_alignBottom與指定id值的控件的下端對齊layout_alignRight與指定id值的控件的右端對齊layout_alignLeft與指定id值的控件的左端對齊圖-93.5.1.3.【案例3.5】用相對布局制作登錄界面本案例顯示如圖-10所示的登錄界面:圖-10以下是XML代碼示例:達內IT培訓集團(1)本控件位于(1)所定義的控件3.5.2.TableLayout(表格布局)3.5.2.1.概述

達內IT培訓集團

1、表格布局采用行列的形式來管理UI中的控件。

2、TableRow用來管理表格中的行,TableRow中的一個控件占據(jù)該行的一列。若不用TableRow,而3、列數(shù)由表格中最多的列決定。整個表格的寬度默認是占滿整個父容器。直接放置一個控件,則該控件將獨占一行。

3.5.2.2【案例3.6】表格布局示例

用表格布局實現(xiàn)圖-19的登錄界面。代碼如圖-23所示:

3.5.3.LinearLayout(線性布局)3.5.3.1.概述

線性布局在前面已闡述,線性布局有水平和縱向兩個方向,線性布局通過嵌套布局也可實現(xiàn)復雜的布局。

提示:嵌套布局是指一個布局中還包含若干個布局。

3.5.3.2.weight屬性

該屬性控制水平和垂直方向某個控件所占的比例,用該屬性可實現(xiàn)類似于網頁中框架布局的效果。

達內IT培訓集團

3.5.3.3.【案例3.7】用嵌套布局結合線性布局實現(xiàn)圖-10的登錄界面設計。

圖-24中的代碼演示了用線性布局加嵌套布局實現(xiàn)登錄界面:

達內IT培訓集團

寬度寬度android:layout_width="fill_parent"android:layout_height="wrap_content">16

達內IT培訓集團

圖-253.5.4.AboluteLayout(絕對布局)3.5.4.1.概述

絕對布局(AbsoultLayout):完全由程序員自己設置控件在屏幕中的位置、大小等屬性。提示:絕對布局因不利于適配不同的屏幕,因此不建議使用該布局方式開發(fā)。

3.5.4.2.常用屬性

在絕對布局中,每個控件都有以下兩個屬性用于定位:1、layout_x:設置控件在屏幕上的橫坐標。2、layout_y:設置控件在屏幕上的縱坐標。

3.5.4.3.【案例3.8】用絕對布局完成圖-10的登錄界面設計

達內IT培訓集團3.5.5.FrameLayout(幀布局)3.5.5.1概述

幀布局中,容器為每個加入其中的控件創(chuàng)建一個空白的區(qū)域(稱為一幀)。每個控件占據(jù)一幀,這些幀會按gravity屬性執(zhí)行自動對齊。

幀布局的的效果是將其中的所有控件都疊加在一起。

達內IT培訓集團

3.5.5.2.常用屬性

XML屬性ForegroundforegroundGravityt)相關方法setForeground(Drawable)setFroegroundGravity(in說明設置該幀布局容器的前景顏色定義繪制前景圖像的gravity屬性3.5.5.3.【案例3.9】

用幀布局實現(xiàn)圖-11的三個圖片疊加的效果。其中,最上面的圖片尺寸:32×32,中間的圖片尺寸64×64,最下面的圖片尺寸:128×128。圖片1圖片3圖片2圖-11以下代碼是圖-11的XML代碼:

3.6.常用操作技巧3.6.1.如何輸入中文

步驟1、按圖-12操作

達內IT培訓集團

(1)長按輸入框(2)單擊此處圖-12步驟2、按圖-13操作單擊此處圖-133.6.2.如何查看SDK源代碼步驟1、下載AndroidSDK2.3.3源代碼;步驟2、假設Android的SDK所在路徑是E:\\MyTools\\android-sdk\\android-sdk-windows\\platforms\\android-10按以下步驟操作:在資源管理器中定位至此路徑下

將源代碼所在文件夾命名為sources,并復制到此處達內IT培訓集團

圖-14

3.7.常見問題

3.7.1.代碼與APK不同步

原因:在確保代碼沒有錯誤的前提下,可以確認這是Android系統(tǒng)沒有及時更新,做到與APK同步。解決辦法:單擊Eclipse菜單欄中的Project,單擊Clean。(1)選則只更新選定的項目(2)選中某個項目(3)單擊OK按鈕

圖-15

友情提示:本文中關于《達內培訓總結》給出的范例僅供您參考拓展思維使用,達內培訓總結:該篇文章建議您自主創(chuàng)作。

來源:網絡整理 免責聲明:本文僅限學習分享,如產生版權問題,請聯(lián)系我們及時刪除。


達內培訓總結》由互聯(lián)網用戶整理提供,轉載分享請保留原作者信息,謝謝!
鏈接地址:http://www.seogis.com/gongwen/479066.html
相關文章