我一直在努力應對一個特定的挑戰,如下所示:
我的應用程式有一個活動“A”,它被視為應用程式的“主要”活動。在某個時刻,它啟動一個活動“B”,它有一個可用的動作,應該在活動“A”中啟動一個片段(這并不總是相同的片段,它將取決于來自我們后端的一些資料)。
我可以通過簡單地startActivity使用正確的 Intent呼叫來做到這一點,但是,在按下后退按鈕時,它會回傳到 A 的“主要片段”(這是在 A 內部實作的邏輯onBackButtonPressed())。基本上,應該發生的事情如下:
Activity A -> Activity B -> Activity A 顯示 Fragment X -> press back -> Activity B
startActivity用于啟動 Activity A時會發生什么:
活動 A -> 活動 B -> 顯示片段 X 的活動 A -> 按下回傳 -> 活動 A 顯示“主要片段”。從這里開始,如果我再次按下應用程式退出,這又是 A 的實作的一部分onBackButtonPressed,但是我已經嘗試extra從呼叫 A 的意圖中檢索 an以便有條件地帶回活動 B 但意圖似乎是空的額外的原因我無法弄清楚。我確信我正確地將額外內容放入了 Intent 中,因為活動 A 在根據我放置的內容從 B 呼叫時啟動了正確的片段。
我嘗試過的更多事情:
直接從 B 中啟動所需的片段,但是這樣片段不會與 A 中存在的導航欄一起顯示,并且似乎在片段元素后面顯示活動 B 的主要內容,這在用戶體驗方面是不可取的。
使用
Intent.FLAG_ACTIVITY_REORDER_TO_FRONT標志,這似乎沒有任何區別。
由于這是我公司應用程式的一部分,它已經具有相當程度的復雜性,我不能隨意為您提供有用的代碼示例,希望我的描述足以幫助我。
附加資訊
targetApi="n"
在 Android 11 上測驗
Activity A 具有 launchMode“singleTask”
Activity B 具有 launchMode“singleTop”
uj5u.com熱心網友回復:
對于預期行為:
避免使用任何
launchMode,taskAffinity或活動標志,默認行為是對你的要求絕對好("standard"是默認啟動模式)。所以當你在 Activity B 中執行 action 時,將 B 放入 backstack 后會啟動一個新的 Activity A 實體,這是默認行為。您應該在 Activity A 中具有這樣的邏輯
onBackPressed():如果片段 X 可見,則它將退出整個 Activity,否則它會通過呼叫super(). 類似于以下內容:
在活動 A
@Override
public void onBackPressed() {
Fragment fragment = getFragmentManager().findFragmentByTag("yourTagForFragmentX");
if (fragment instanceof XFragment) {
// The fragment is available in the fragment manager
finish()
} else {
super.onBackPressed();
}
}
欲了解更多詳情,請點擊此處
uj5u.com熱心網友回復:
我認為你把事情復雜化了。
- 洗掉 A 和 B 的所有啟動模式標志 - 它們不是必需的。
- 洗掉自定義處理
onBackPressed- 默認處理就足夠了。 - 更新 A 以根據給定的意圖將自身初始化為正確的片段:
例如:
onCreate(...) {
if (getIntent().getAction() == "START_ON_X") {
// Notice we REPLACE and DO NOT add to back stack
getFragmentManager().replace(fragID, createXFragment()).commit()
}
else {
getFragmentManager().replace(fragID, createDefaultFragment()).commit()
}
}
因此,您將擁有:
- 默認啟動器意圖啟動 A。
- A 啟動 B.
- B 以特定意圖啟動 A 以顯示 Fragment X
這會給你一堆 A -> B -> Ax
然后當你按下回傳鍵時,DEFAULT BEHAVIOR 會讓你處于 B 狀態。
然后再按回會讓你留在 A 上。
然后再次按回將關閉您的應用程式。
同樣,這是所有標準的默認行為。吻。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/381062.html
標籤:安卓 科特林 android-fragments 安卓活动
