場景
在使用App時,曾經看到這樣一個場景,如下圖所示,點選頂部菜單按鈕,有一個類似的對話框的清單顯示出來,讓使用者選擇其中的一個快遞選項,然後選中的快遞資訊就會填充到底部的Activity中。

activity.png
分析
類似這樣的效果到底是怎麼做出來的?彈出的是一個普通對話框嗎?其實不一定,彈出的可能是一個Activity,但不同的是該Activity是浮動顯示在某一個Activity之上,而不是直接跳轉。
案例
在最近一個App中有一個界面如下:
float activity.png
點選底層Activity中浮動按鈕,會浮動一個年份清單,選擇某一個年份後回到底部Activity,然後底部Activity根據選擇的年份加載對應的資料。這裡底層的Activity略過,重點講解一下浮動的Activity是如何實作的。
1、由于其本質還是一個Activity,是以看到的界面就是需要在xml中布局,這裡非常簡單,就是一個ListView,顯示年份,比較簡單,就不粘貼代碼了
2、建立一個style,該style配置Activity為浮動顯示
<style name="Theme.Transparent" parent="android:Theme.Dialog">
<item name="android:windowIsTranslucent">true</item>//此對話框的背景
<item name="android:windowBackground">@android:color/transparent</item>//對話框是否透明
<item name="android:windowContentOverlay">@null</item>//對話框是否有遮蓋
<item name="android:windowNoTitle">true</item>//對話框無标題
<item name="android:windowIsFloating">true</item> //對話框是否浮動
<item name="android:backgroundDimEnabled">true</item>//是否允許對話框的背景變暗
</style>
3、AndroidManifest.xml中設定Activity的主題如上
<activity
android:name="com.activity.SelYearActivity"
android:theme="@style/Theme.Transparent"></activity>
4、在底部的Activity中調用
startActivityForResult
,并重寫
onActivityResult
方法接收浮動Activity傳回的資料,進行相應的邏輯處理,如之前提到的快遞資訊。
5、最後在浮動的Activity中設定ListView的點選事件,這裡将要将傳回的資料添加到Intent中,然後調用
setResult
和
onBackPressed()
,傳值回底層的Activity并讓目前浮動的Activity消失,大功告成。代碼如下
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
//将選擇的年份回傳至上個界面 并讓本界面消失
Intent intent = new Intent();
intent.putExtra("selYear", years.get(i));
setResult(RESULT_OK, intent);
onBackPressed();
}
});