【移動(dòng)應(yīng)用開發(fā)技術(shù)】a?n?d?r?o?i?d?4.x新?特?征?總?結(jié)_第1頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】a?n?d?r?o?i?d?4.x新?特?征?總?結(jié)_第2頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】a?n?d?r?o?i?d?4.x新?特?征?總?結(jié)_第3頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】a?n?d?r?o?i?d?4.x新?特?征?總?結(jié)_第4頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】a?n?d?r?o?i?d?4.x新?特?征?總?結(jié)_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

【移動(dòng)應(yīng)用開發(fā)技術(shù)】a?n?d?r?o?i?d?4.x新?特?征?總?結(jié)

Android新特征為了兼容老版本,改變了很多東西,這里先對(duì)幾個(gè)重要的特征進(jìn)行研究。

第一,系統(tǒng)生成工程出現(xiàn)一個(gè)v7的東西,這個(gè)是兼容包,很多人覺得很不爽,忘了他把,這個(gè)是必要的,不能刪除,工程要用到里面的v7擴(kuò)展包和主題資源什么的,而且你用到fragment的話就必須要那個(gè)包里的主題!測(cè)試可以直接點(diǎn)中你要的工程進(jìn)行測(cè)試就可以了,無需其他操作,和之前的一樣!

第二:系統(tǒng)默認(rèn)的布局變成了兩個(gè),一個(gè)是main_activity和fragment_activity兩個(gè)。這個(gè)是什么原因,main的布局默認(rèn)是<fragment>根節(jié)點(diǎn),fragment的布局是默認(rèn)相對(duì)布局的,這個(gè)你可以隨便改,線性布局,幀布局的都可以用,和我們之前用的main_activity是一樣的,那他們有什么關(guān)系呢,其實(shí)這里要說一點(diǎn),對(duì)于fragment有兩種裝載方式:第一是布局裝載,直接在布局中寫入fragment節(jié)點(diǎn),如下:

<?xmlversion="1.0"encoding="utf-8"?>

<LinearLayout

xmlns:android="/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>

這個(gè)fragment節(jié)點(diǎn)必須要有id,這樣代碼才能針對(duì)不同的id進(jìn)行不同的裝載。

第二是代碼裝載,就是官方提供的默認(rèn)裝載,如下:

<FrameLayout

xmlns:android="/apk/res/android"

xmlns:tools="/tools"

android:id="@+id/container"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context="walleeva.android4_4_frame.MainActivity"

tools:ignore="MergeRootFrame"

/>

然后通過framelayout的id進(jìn)行代碼裝載,目測(cè)兩種其實(shí)有不同,一個(gè)是針對(duì)一個(gè)頁面多個(gè)fragment分塊顯示,一個(gè)是一個(gè)頁面顯示一個(gè)fragment,然后通過裝載來切換!

這里我們簡單總結(jié)一下fragment和一activity的區(qū)別:

Activity的布局是一個(gè)容器,好比一個(gè)房間的整個(gè)空間,fragment好比是對(duì)其進(jìn)行裝修,你可以一個(gè)裝修風(fēng)格布滿整個(gè)房間,也可以分開很多塊分別專修,可以通過不同時(shí)候,顯示不同燈光效果達(dá)到參觀者(用戶)看到不同表現(xiàn)。

既然谷歌選擇默認(rèn)后一種,我們就從這種開始研究,首先,我們看到MainActivity,發(fā)現(xiàn)大問題,不是繼承了Activity,而是ActionBarActivity,這里又有新知識(shí),(我是對(duì)fragment和actionbar不熟悉的,所以我覺得是新知識(shí)),actionbaractivity和activity有什么區(qū)別呢?

百度是這樣回答的:AndroidBarActivity是支持庫里的類可以兼容2.x版本activity提供的actionbar只有在3.0以上才可以用.

顯然這個(gè)答案太抽象,現(xiàn)在我們先完成fragment的顯示切換,然后在修改使得他通過actionbar進(jìn)行切換。

完成fragment布局切換:

1,在manifest文件中的application節(jié)點(diǎn)修改主題:

<application

android:allowBackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/Theme.AppCompat.Light"

>

貌似都要用appcompat下的主題才行!當(dāng)然你可以針對(duì)activity節(jié)點(diǎn)進(jìn)行修改,我這樣一勞永逸。

2,新建多一個(gè)fragment_main布局,內(nèi)容可以隨意,

3,新建兩個(gè)類,你可以將系統(tǒng)默認(rèn)里面生產(chǎn)的類拷貝出來,然后在新建類中粘帖上去,把原來mainactivity中的內(nèi)部類刪除,這些類都是繼承importandroid.support.v4.app.Fragment;

至于fragment的類要怎么寫,先給出fragment的生命周期

你可以右鍵空白處,source,然后Override選項(xiàng)查看有那些可覆寫的方法,這個(gè)給個(gè)例子public

class

PlaceholderFragment

extends

Fragment

{

public

TextView

text;

SendDateToActivity

sdta;

public

PlaceholderFragment()

{

}

@Override

public

void

onAttach(Activity

activity)

{

super.onAttach(activity);

try{

//這里進(jìn)行綁定實(shí)現(xiàn),如果activity沒有實(shí)現(xiàn)對(duì)應(yīng)辦法,則會(huì)出錯(cuò)!

sdta=(SendDateToActivity)activity;

}catch(ClassCastException

e){

}

}

@Override

public

void

onStart()

{

//所有在frame布局中定義的控件都需要在oncreateview這個(gè)方法執(zhí)行后實(shí)例

//化,最好在這里就可以了,否則死了都不知道什么回事!

text=(TextView)getActivity().findViewById(R.id.fragment1t1);

//這里進(jìn)行調(diào)用

text.setText(sdta.setEditText());

super.onStart();

}

@Override

public

View

onCreateView(LayoutInflater

inflater,

ViewGroup

container,

Bundle

savedInstanceState)

{

//這個(gè)方法進(jìn)行裝載fragment,

View

rootView

=

inflater.inflate(R.layout.fragment_main,container,false);

return

rootView;

}

//這是一個(gè)接口,對(duì)應(yīng)的實(shí)現(xiàn)寫在activity中,實(shí)現(xiàn)對(duì)應(yīng)的方法,這樣,這里就可以調(diào)用activity中的方法,實(shí)現(xiàn)數(shù)據(jù)傳遞。

public

interface

SendDateToActivity{

public

String

setEditText();

}

}這里是mainactivity的源代碼,一起貼出來

public

class

MainActivity

extends

ActionBarActivity

implements

SendDateToActivity,SendDateToActivity2{

public

String

edittext;

@Override

protected

void

onCreate(Bundle

savedInstanceState)

{

super.onCreate(savedInstanceState);

//requestWindowFeature(Window.FEATURE_NO_TITLE);

setContentView(R.layout.activity_main);

if

(savedInstanceState

==

null)

{

//這里預(yù)先裝載了一個(gè)fragment進(jìn)行顯示。

getSupportFragmentManager().beginTransaction().add(R.id.container,

new

PlaceholderFragment2()).commit();

}

}

@Override

public

boolean

onCreateOptionsMenu(Menu

menu)

{

//這里定義了兩個(gè)按鈕

MenuInflater

menuInflater

=

getMenuInflater();

menuInflater.inflate(R.menu.main,

menu);

MenuItem

menuItem

=

menu.findItem(R.id.action_search);

MenuItem

findItem

=

menu.findItem(R.id.action_compose);

MenuItemCompat.setShowAsAction(menuItem,

MenuItemCompat.SHOW_AS_ACTION_ALWAYS);

MenuItemCompat.setShowAsAction(findItem,

MenuItemCompat.SHOW_AS_ACTION_ALWAYS);

return

true;

}

//這里進(jìn)行按鈕選擇

@Override

public

boolean

onOptionsItemSelected(MenuItem

item)

{

int

id

=

item.getItemId();

if

(id

==

R.id.action_compose)

{

getSupportFragmentManager().beginTransaction().replace(R.id.container,

new

PlaceholderFragment()).commit();

return

true;

}else

if(id

==

R.id.action_search){

getSupportFragmentManager().beginTransaction().replace(R.id.container,

new

PlaceholderFragment2()).commit();

return

true;

}

return

super.onOptionsItemSelected(item);

}

}菜單布局如下:<menu

xmlns:android="/apk/res/android"

xmlns:app="/apk/res-auto"

xmlns:tools="/tools"

tools:context="walleeva.android4_4_frame.MainActivity">

<item

android:id="@+id/action_search"

android:icon="@drawable/abc_ic_clear"

android:title="@string/action_settings"/>

<item

android:id="@+id/action_compose"

android:icon="@drawable/abc_ic_go"

android:title="@string/abc_activity_chooser_view_see_all"/>

</menu>

這樣就實(shí)現(xiàn)了按菜單按鈕實(shí)現(xiàn)fragment切換,按fragment2中的按鈕可以實(shí)現(xiàn)參數(shù)傳遞到另一個(gè)fragment進(jìn)行顯示,

這里完成了fragment切換及其參數(shù)傳遞的功能,這樣面對(duì)新的默認(rèn)布局,我們也能從容面對(duì)了。

可是還有一個(gè)問題就actionbar,首先明白actionbar是什么,顧名思義就是action的一個(gè)bar,也就是動(dòng)作的點(diǎn)擊按鈕之類的!可以這么理解吧!Csdn有人這么歸納:

通過查資料,最后實(shí)現(xiàn)了通過actionbar進(jìn)行頁面切換,下拉導(dǎo)航,標(biāo)簽頁切換fragment,第四第五個(gè)還不知道什么意思,畢竟也是初次接觸。大神請(qǐng)忽略這篇文檔!

其實(shí)要實(shí)現(xiàn)actionbar,需要做以下幾件事,

1,就是你的activity必須是以android:theme="@style/Theme.AppCompat.Light"為主題,或者繼承它的自定義主題

2,必須要顯示標(biāo)題欄,不可設(shè)置為無標(biāo)題欄顯示狀態(tài),網(wǎng)上有方法說可以解決,但是試過不行,有待研究,

3,如果要在底部出現(xiàn)菜單欄請(qǐng)?jiān)趯?duì)于的activity節(jié)點(diǎn)中加入如下:

android:uiOptions="splitActionBarWhenNarrow"

4,對(duì)于要顯示的item一般和系統(tǒng)的meun寫法一樣,只不過多一個(gè)android:showAsAction="never"

建議這個(gè)屬性用代碼實(shí)現(xiàn),因?yàn)楹苋菀壮霈F(xiàn)沒效果的,如之前onCreateOptionsMenu方法中的代碼所示

5,對(duì)于MenuItemCompat.SHOW_AS_ACTION_ALWAYS,后面的為參數(shù)有5,6種類型,可以直接百度,具體是用來控制bar顯示還是隱藏的相關(guān)屬性,不同屬性有不同表現(xiàn)方式!

6,對(duì)于顯示下拉列表功能則是通過如下代碼實(shí)現(xiàn)

PopupMenu

mPopupMenu=null;

case

R.id.myselfitem:

//這個(gè)為監(jiān)聽的按鈕,也可是一個(gè)bar

if

(mPopupMenu

==

null)

{

mPopupMenu

=

new

PopupMenu(this,

findViewById(R.id.myselfitem));

//這個(gè)id為按鈕id

mPopupMenu.inflate(R.menu.mymeun);

//此時(shí)所在類要實(shí)現(xiàn)OnMenuItemClickListener,然后在接口中獲取item的id,根據(jù)id

//進(jìn)行響應(yīng)即可

mPopupMenu.setOnMenuItemClickListener(this);

}

mPopupMenu.show();

return

true;對(duì)應(yīng)布局很簡單

和系統(tǒng)的meun寫法一樣的!自己去定義,

7,標(biāo)簽頁現(xiàn)在應(yīng)該都是統(tǒng)一用actionbar來實(shí)現(xiàn)了,而不是用之前的tabhost,actionbar完成可以通過控制不同的fragment顯示,具體代碼如下:protected

void

onCreate(Bundle

savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_theme_holo);

getActionBar().setDisplayHomeAsUpEnabled(true);

getActionBar().setHomeButtonEnabled(true);

final

ActionBar

actionBar

=

getSupportActionBar();

//提示getActionBar方法一定在setContentView后面

actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

actionBar.setDisplayOptions(0,

ActionBar.DISPLAY_SHOW_TITLE);

Fragment

artistsFragment

=

new

PlaceholderFragment();

actionBar.addTab(actionBar.newTab().setText("first").setTabListener(

new

MyTabListener(artistsFragment)));

Fragment

albumsFragment

=

new

PlaceholderFragment2();

actionBar.addTab(actionBar.newTab().setText("second").setTabListener(

new

MyTabListener(albumsFragment)));

}在對(duì)于的a

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論