編輯:Android開發實例
Dialog。它並不引起Activity棧的任何改變。
所以當search dialog 被啟動的時候, 並不會有生命周期函數被調動(比如onPause()
)。你的activity只是失去輸入焦點,因為輸入焦點被轉移到了search dialog.
如果你想在啟動search dialog的時候被notified,那麼請重寫Activity的onSearchRequested()
方法.
當系統調用該方法的時候,說明你的activity已經失去輸入焦點,輸入焦點已經轉移到了search dialog, 所以你就可以針對這個事件在這裡做些和你的work相關的事情(比如暫停游戲).在onSearchRequested的最後你再調用父類的onSearchRequested就可以了。
比如示例4:
@Override public boolean onSearchRequested() {
pauseSomeStuff();
return super.onSearchRequested();
}
如果用戶通過按BACK鍵取消搜索的話,search dialog 將關閉 ,你的activity將再次獲得輸入焦點。你可以通過setOnDismissListener()/setOnCancelListener()注冊監聽器
OnDismissListener/OnCancelListener來監聽
search dialog的關閉. 當search dialog 關閉的時候,OnDismissListener就會被調用。OnCancelListener
只是在用戶顯式的退出search dialog時, 才被調用,當用戶執行搜索的時候並不會被調用(這種情況用戶只是很自然的消失,並不取消).
如果當前activity並不是我們所指定的searchable activity, 那麼當用戶執行搜索的時候,普通的activity生命周期事件將被觸發
(它將調用onPause(),被暫停). 然而,如果當前就是current activity指定的searchable activity的話,下面的兩件事情將發生:
A,默認的話,searchable activity 將調用onCreate()
來響應 該ACTION_SEARCH
intent ,然後這個activity的一個新實例將被放到activity stack。這時你的searchable activity就有兩個實例在activity stack 中(如果按下BACK鍵,將回到前一個searchable activity實例,
而不是離開searchable activity).
B,如果你把searchable activity的 android:launchMode
屬性設置為了 "singleTop"
, 那麼searchable activity 將調用onNewIntent(Intent)來響應該ACTION_SEARCH
, 同時ACTION_SEARCH
intent也是在這裡被傳入 .下面的示例5, 就是一個當searchable activity的launch mode 是 "singleTop"時,該如何處理的一個很好例子。
示例5:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.search);
handleIntent(getIntent());
}
@Override
protected void onNewIntent(Intent intent) {
setIntent(intent);
handleIntent(intent);
}
private void handleIntent(Intent intent) {
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
String query = intent.getStringExtra(SearchManager.QUERY);
doMySearch(query);
}
}
這裡所有對search intent的處理都是放在handleIntent()
函數中的, 這樣 在onCreate()
和 onNewIntent()
中直接調用它就行了.
當系統調用onNewIntent(Intent)的時候,表示
activity並不是新建的, 所以getIntent()返回的還是
在onCreate()中接受到的intent
. 因此你必須在onNewIntent(Intent)調用
setIntent(Intent)來 (這樣保存的intent才被更新,之後你可以同過getIntent()來取得它
).
使用"singleTop"
是常用的處理方法, 因為一旦用戶執行了一次搜索,它往往還想執行一次搜索,而且創建大量的searchable activity不太好。因此建議把所有的searchable activity 都在manifest中把它設置為"singleTop"
模式 。
比如,示例6
<activity android:name=".SearchableActivity"
android:launchMode="singleTop" >
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data android:name="android.app.searchable"
android:resource="@xml/searchable"/>
</activity>:
八、向searchable activity傳送數據
有時,你可能想在searchable activity收到的搜索關鍵字的基礎上再添加些內容。然而有時添加的內容依取決於啟動search dialog的Activity。Anroid可以讓你在系統向searchable activity發送的intent時候,向該intent添加你的數據。ACTION_SEARCH
intent通過攜帶一個名叫APP_DATA的
Bundle來攜帶你的數據。為了傳送你的數據,請在要執行搜索請求的Acitivity中重寫
onSearchRequested()
,創建一個Bundle,並把你要攜帶的數據放在其中,然後以Bundle為參數之一來調用
startSearch()激活
search dialog.
比如,示例7:
@Override
public boolean onSearchRequested() {
Bundle appData = new Bundle();
appData.putBoolean(SearchableActivity.JARGON, true);
startSearch(null, false, appData, false);
return true;
}
返回"true"表示你已經成功處理了該回調事件,調用startSearch()是為了激活
search dialog. 一旦用戶提交了搜索請求, 它將和你添加的數據一樣被傳送到searchable activity。 你可以通過APP_DATA
Bundle來提取它。
比如:
示例8:
Bundle appData = getIntent().getBundleExtra(SearchManager.APP_DATA);
if (appData != null) {
boolean jargon = appData.getBoolean(SearchableActivity.JARGON);
}
注意:不要在onSearchRequested()之外調用
startSearch()方法。
當需要在你的activity中激活search dialog請總是onSearchRequested()
. 否則, 如果onSearchRequested()沒被調用,一些個性化得操作就不能得到執行
(比如上面例子的添加額外數據)
自從Fragment出現,曾經有段時間,感覺大家談什麼都能跟Fragment談上關系,做什麼都要問下Fragment能實現不~~~哈哈,是不是有點過~~~ 為了
在Android上開發一些小應用既可以積累知識又可以增加樂趣,與任務式開發不同
可以顯示在的Android任務,通過加載進度條的進展。進度條有兩種形狀。加載欄和加載微調(spinner)。在本章中,我們將討論微調(spinner)。Spinner 用
本文實例講述了Android實現文字和圖片混排(文字環繞圖片)效果。分享給大家供大家參考,具體如下: 在平時我們做項目中,或許有要對一張圖片或者某一個東西進行文字