第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何將 StartActivityForResult 事件注冊(cè)到 ViewModel?[MVVM]

如何將 StartActivityForResult 事件注冊(cè)到 ViewModel?[MVVM]

慕工程0101907 2023-06-08 20:03:20
我在使用 Java 中的 MVVM 實(shí)現(xiàn) Google 登錄時(shí)遇到問題。在這里,您將以正常方式看到來自 Google 的示例代碼:問題:在你的活動(dòng)中:@Overridepublic void onCreate(Bundle savedInstanceState) {    /* Here is the Issue:     * Google Object is defined in View - Activity     * I would like to have Google Object defined in my ViewModel     */    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).requestEmail().build();    mGoogleSignInClient = GoogleSignIn.getClient(this, gso);}// when Google Button CLicked@Overridepublic void onClick(View v) { signIn(); }private void signIn() {    /* Here is the Issue:     * I have to get this process done in View Model     * so view will not reference any Google Object     */    Intent signInIntent = mGoogleSignInClient.getSignInIntent();    startActivityForResult(signInIntent, RC_SIGN_IN);}@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) {    super.onActivityResult(requestCode, resultCode, data);    // Below will be processed in ViewModel    GoogleSignInClient.getSignInIntent(...);    if (requestCode == RC_SIGN_IN) {        Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);        handleSignInResult(task);    }}問題: *見評(píng)論所以我想出了下面的想法:在活動(dòng)中:// when Google Button CLicked@Overridepublic void onClick(View v) { viewModel.loginGoogle(); }private void subscribeUi() {    // register startActivityForResult Event to ViewModel and set this activity as receiver...    // viewModel.startActivityForResultEvent.setEventReceiver(this Activity)    // How to do this?}@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) {    // send the result to View Model    viewModel.onResultFromActivity(requestCode,resultCode,data);    // escallate to super    super.onActivityResult(requestCode, resultCode, data)}
查看完整描述

4 回答

?
大話西游666

TA貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超14個(gè)贊

我認(rèn)為您可以執(zhí)行以下操作,它不持有全局引用,context因此不會(huì)泄漏


  public void loginGoogle(Context context){


         if(isSigningIn)

            return


         context.startActivityForResult(getGoogleSignInIntent(), GOOGLE_SIGN_IN)

         isSigningIn = true;

    }


查看完整回答
反對(duì) 回復(fù) 2023-06-08
?
臨摹微笑

TA貢獻(xiàn)1982條經(jīng)驗(yàn) 獲得超2個(gè)贊

替換 startActivityForResult 的文檔和函數(shù)似乎不鼓勵(lì)這樣做:

注冊(cè)請(qǐng)求以啟動(dòng)由給定合同指定的結(jié)果活動(dòng)。這會(huì)在與此調(diào)用者關(guān)聯(lián)的注冊(cè)表中創(chuàng)建一個(gè)記錄,管理請(qǐng)求代碼,以及在后臺(tái)與 Intent 的轉(zhuǎn)換。這必須無條件調(diào)用,作為初始化路徑的一部分,通常作為 Activity 或 Fragment 的字段初始化程序。如果此片段的宿主是 ActivityResultRegistryOwner,則將使用宿主的 ActivityResultRegistry。否則,這將使用片段的活動(dòng)注冊(cè)表。

注意“This must be called unconditionally, as part of initialization path”。

另請(qǐng)注意此 IlliegalStateException 消息:

片段 [this] 在創(chuàng)建后嘗試注冊(cè) ForActivityResult。片段必須在創(chuàng)建之前調(diào)用“registerForActivityResult()”(即初始化、“onAttach() 或 onCreate())”。

所以我的建議是將契約和registerForActivityResult()你的 Activity 或 FragmentonCreate放在你的視圖模型/域類中的函數(shù)中,無論你將對(duì)結(jié)果做什么,這基本上就是你已經(jīng)在做的事情。


查看完整回答
反對(duì) 回復(fù) 2023-06-08
?
狐的傳說

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超3個(gè)贊

您可以使用 SingleLiveData 打開新屏幕。

  1. 您創(chuàng)建具有所有必要參數(shù)的類來啟動(dòng)活動(dòng)

  2. 在 ViewModel 中,您使用需要的參數(shù)創(chuàng)建此類

  3. 您在 ViewModel 中創(chuàng)建單個(gè)實(shí)時(shí)數(shù)據(jù)字段并從活動(dòng)/片段中觀察它

  4. 你用 SingleLiveData 發(fā)送這個(gè)類

創(chuàng)建類:

public Enum Screen {

? ?LOGIN

}

在視圖模型中:


...


private SingleLiveData<Screen> onOpenScreen = new SingleLiveData<Screen>()


public SingleLiveData<Screen> observeScreenOpen() {

? ? return onOpenScreen

}


public void loginGoogle(){

? ? onOpenScreen.value = Screen.LOGIN

}


...

在活動(dòng)/片段中


viewModel.observeScreenOpen(this, new Observer<Screen> {screen->

? ? if(screen == Screen.LOGIN) {

? ? ? ? //start your activity here

? ? }

})


查看完整回答
反對(duì) 回復(fù) 2023-06-08
?
慕蓋茨4494581

TA貢獻(xiàn)1850條經(jīng)驗(yàn) 獲得超11個(gè)贊

我要做的是在被調(diào)用的 ViewModel 中注冊(cè)一個(gè)回調(diào),Activity 可以對(duì)其做出反應(yīng)。然后 ViewModel 可以擁有大部分業(yè)務(wù)邏輯,但不必引用 Activity 或 Context,Activity 可以處理啟動(dòng) Intent 的 Activity 特定內(nèi)容。


例子:


回調(diào)接口:


interface OnSignInStartedListener {

    void onSignInStarted(GoogleSignInClient client);

}

視圖模型:


public class ViewModel {

    private final OnSignInStartedListener mListener;


    public ViewModel(OnSignInStartedListener listener) {

        mListener = listener;

    }


    public void viewModelOnCreate() {

        // This is what i want: Google object defined in View Model

        // but I dont know how to call startActivityForResult from here?

        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).requestEmail().build();

        mGoogleSignInClient = GoogleSignIn.getClient(getApplication(), gso);

    }


    public void loginGoogle() {

        // Invoke callback here to notify Activity

        mListener.onSignInStarted(mGoogleSignInClient);

    }

}

活動(dòng):


protected void onCreate(Bundle savedInstanceState) {

    ...

    mViewModel = new ViewModel(new OnSignInStartedListener() {

        @Override

        public void onSignInStarted(GoogleSignInClient client) {

            startActivityForResult(client.getSignInIntent(), RC_SIGN_IN);

        }

    });

    ...

}


@Override

public void onClick(View v) {

    // Invokes listener this activity created to start sign in flow

    viewModel.loginGoogle();

}

希望有幫助!


查看完整回答
反對(duì) 回復(fù) 2023-06-08
  • 4 回答
  • 0 關(guān)注
  • 246 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)