首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android Fragment 登入頁面:透過廣播或介面回調將登入資料傳回 Fragment 更新 UI

     編輯:程式設計疑難解答

在 Fragment 架構的登入流程中:Fragment A(帳號輸入)→ Fragment/Activity B(密碼輸入)→ 登入成功 → 需通知 Fragment A 更新頭像/狀態。推薦三種主流方案:

方案一:LocalBroadcastManager(解耦、跨進程也可用)


// Fragment A 註冊
LocalBroadcastManager.getInstance(requireContext())
    .registerReceiver(loginReceiver, new IntentFilter("LOGIN_SUCCESS"));

// 登入頁面發送
Intent intent = new Intent("LOGIN_SUCCESS");
intent.putExtra("avatarUrl", url);
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);

// Fragment A 接收
private BroadcastReceiver loginReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String url = intent.getStringExtra("avatarUrl");
        updateAvatar(url);
    }
};

@Override
public void onDestroy() {
    super.onDestroy();
    LocalBroadcastManager.getInstance(requireContext()).unregisterReceiver(loginReceiver);
}

方案二:共用 ViewModel(官方推薦、生命週期感知)


// SharedViewModel.kt
class SharedViewModel : ViewModel() {
    val loginResult = MutableLiveData()
}

// Fragment A 觀察
viewModel.loginResult.observe(getViewLifecycleOwner(), result -> {
    updateAvatar(result.avatarUrl);
});

// 登入頁面設定
viewModel.loginResult.postValue(new LoginResult(avatarUrl));

方案三:Fragment Result API(AndroidX Fragment 1.3.0+,無需 ViewModel)


// 登入 Fragment (B) 設定結果
getParentFragmentManager().setFragmentResult("login_request", bundleOf("avatarUrl" to url))

// Fragment A 監聽
getParentFragmentManager().setFragmentResultListener("login_request", this, { _, bundle ->
    val url = bundle.getString("avatarUrl")
    updateAvatar(url)
})

選擇建議

方案優點適用場景
LocalBroadcast簡單、跨 Activity/Service舊專案、需跨進程通訊
SharedViewModel生命週期安全、資料集中、易測試現代 MVVM 架構、多 Fragment 共享狀態
Fragment Result輕量、無額外依賴、型別安全單純 Fragment 間回傳資料

若專案已導入 ViewModel,**方案二最佳**;若輕量需求,**方案三最簡潔**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved