1. 程式人生 > >Fragment中呼叫startActivityForResult問題

Fragment中呼叫startActivityForResult問題

在使用support v4中的Fragment時,如果我們需要呼叫startActivityForResult方法來與跳轉的Activity進行通訊時,如果希望Fragment的onActivityResult方法能夠被響應,我們就必須呼叫Fragment的startActivityForResult方法,而不是呼叫:

getActivity().startActivityForResult()

後者呼叫的是Fragment的宿主Activity,即FragmentActivity的startActivityForResult方法。

兩者的區別如下:

Fragment中的startActivityForResult方法如下:

    public void startActivityForResult(Intent intent, int requestCode) {
        if (mActivity == null) {
            throw new IllegalStateException("Fragment " + this + " not attached to Activity");
        }
        mActivity.startActivityFromFragment(this, intent, requestCode);
    }

呼叫了FragmentActivity中的startActivityFromFragment方法:
    public void startActivityFromFragment(Fragment fragment, Intent intent, 
            int requestCode) {
        if (requestCode == -1) {
            super.startActivityForResult(intent, -1);
            return;
        }
        if ((requestCode&0xffff0000) != 0) {
            throw new IllegalArgumentException("Can only use lower 16 bits for requestCode");
        }
        super.startActivityForResult(intent, ((fragment.mIndex+1)<<16) + (requestCode&0xffff));
    }

可以看到,該方法把Fragment的index值存在了requestCode的高16位,然後呼叫了startActivityForResult方法。

接下來我們來看看訊息的返回處理,FragmentActivity中的onActivityResult方法:

    /**
     * Dispatch incoming result to the correct fragment.
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        mFragments.noteStateNotSaved();
        int index = requestCode>>16;
        if (index != 0) {
            index--;
            if (mFragments.mActive == null || index < 0 || index >= mFragments.mActive.size()) {
                Log.w(TAG, "Activity result fragment index out of range: 0x"
                        + Integer.toHexString(requestCode));
                return;
            }
            Fragment frag = mFragments.mActive.get(index);
            if (frag == null) {
                Log.w(TAG, "Activity result no fragment exists for index: 0x"
                        + Integer.toHexString(requestCode));
            } else {
                frag.onActivityResult(requestCode&0xffff, resultCode, data);
            }
            return;
        }
        
        super.onActivityResult(requestCode, resultCode, data);
    }

這裡把requestCode的高16位(即Fragment的index值)取了出來,並通過index找到對應的Fragment,然後呼叫Fragment的onActivityResult來分發訊息。

因此,如果直接呼叫Fragment的宿主FragmentActivity的startActivityForResult方法,requestCode中就不會存入Fragment的index值,在onActivityResult處理訊息時也會找不到相應的Fragment進行進一步的訊息分發。

相關推薦

Fragment呼叫startActivityForResult的那些坑

本文首發於公眾號“AntDream”,歡迎微信搜尋“AntDream”或掃描文章底部二維碼關注,和我一起每天進步一點點 Fragment中呼叫startActivityForResult要注意幾種情況 用getActivity方法發起呼叫,只有父Activity的onActivityResul

Fragment呼叫startActivityForResult問題

在使用support v4中的Fragment時,如果我們需要呼叫startActivityForResult方法來與跳轉的Activity進行通訊時,如果希望Fragment的onActivityResult方法能夠被響應,我們就必須呼叫Fragment的startAct

關於android在fragment呼叫getActivity()功能進行Toast或者setAdapter時空指標的異常

最近幾天發現線上版本,多了好多NullPointerException空指標異常的錯誤。仔細檢查發現大多實在fragment中呼叫getActivity方法時造成的。我想原因可能是使用者請求網路了但是一直沒結果就點選返回按鈕了,你的activity被finish掉了但是非同

Fragment呼叫onActivityForResult處理

The activity hosting this fragment has its onActivityResult called when the camera activity returns My fragment starts an activity

Fragment呼叫getActivity為null的問題

在使用fragment的時候經常會遇到getActivity()為null的情況。比如我在一個非同步網路請求的回撥中呼叫了getActivity()就會出現空指標問題。之前解決這個問題,通常都是直

Fragment使用startActivityForResult

1、使用getActivity().startActivityForResult 2、onActivityResult為public,不能為protected     public void onClickCity(View view)     {      Log.d

(8)呼叫Fragment自身的startActivityForResult並在Fragment接收返回結果

package com.xzy.fragmentbasicdemo.fragment; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.Fragment; import andro

Android踩坑隨筆FragmentonActivityResult方法不被呼叫

最近專案裡要做頭像功能,參考了這篇部落格(GitHub - zhudfly/SelectAvatarApplication: 一個選擇並顯示頭像圓形控制元件,可以通過拍照或者選擇相簿中的圖片來設定圖片),但是在使用過程中出現拍照無響應,幾經查詢,原因是在Fragment中覆寫onActivityResult(

在一個元件呼叫其他元件的內容||android怎樣在activity獲取fragment的控制元件

//getFragmentManager().findFragmentById(id).getView().findViewById(id); // 此句截自百度知道 詳見google 官方藍芽裡BluetoothChatFragment中setupChat()方法button呼叫EditTex

FragmentstartActivityForResult與onActivityResult詳細解決方案

首先應該在Activity中用frament引用一下onActivityResult(),例如fragmentdemo. onActivityResult(),這裡不用寫父類的super. onActivityResult(), <span style="white-

AndroidFragmentonActivityResult不被呼叫的解決方案

    android開發中,Fragment+ViewPager已經很常見了。其實遇到這個問題,其實挺尷尬的,我相信有很多小夥伴都遇到這個問題。我也在網上找了很多資料,說什麼是android原生的問題,程式設計師偷懶了,沒有處理這個事件分發等。 指錢看過這位仁兄的文章,

fragment呼叫startActivityforResult的回撥問題

在開發過程中,fragment巢狀fragment,多層巢狀後,onActivityforResult()方法無法響應,這個是因為事件傳遞問題,只響應到根fragment(root Fragment),所以必須到根fragment裡截獲回撥事件。 如:

有關startActivityForResultfragment的使用小技巧

這篇博文適合不太會用startActivityForResult的程式設計師觀看,大神就請繞道了。。。 記得是去年有個需求大概是這樣的(當時我還是個小菜鳥,不能體會startActivityForResult的用法和對getActivity()這個方法的理解,走了很多程式

如何在Fragment獲取context

調用 class spa 自己 構造 使用 抽象類 ati 活動 文章轉載自http://blog.csdn.net/demonliuhui/article/details/51511136 這裏僅供自己學習參考; Context,中文直譯為“上下文”,SDK中對其說明

Android 在fragment實現返回鍵單擊提醒 雙擊退出

make listener 一次 time lean 適配器 == sea dagger2 嘗試用mvp架構加dagger2來重寫了一下,大致功能都實現了,還沒有全部完成。 項目地址 接近完成的時候,想在天氣信息頁面實現一個很常見的功能,也就是點擊屏幕下方的返回鍵的時

fragment實現Android上傳圖片至本地JavaWeb服務器

prop prefix adt ilo err 1.10 response try 轉換成 服務器端: 需要一個接受文件的servlet,以及導入兩個包:commons-fileupload-1.3.1.jar 和 commons-io-2.4.jar import ja

ENSP模擬交換環境呼叫高階ACL限制不同網段之間互訪

實驗環境:網段規劃:vlan 100:10.10.10.0 /24 閘道器 10.10.10.254 DNS:8.8.8.8vlan 101:192.168.10.0/24 閘道器 192.168.10.254 DNS:8.8.8.8配置Center1、建立vlanvlan 100description ba

在modal呼叫codemirror

<td> <a href="#editor" data-toggle="modal" type="button" class="btn btn-info" data-toggle="modal" style="margin-right: 5px;">檢視</a

java呼叫本地指令碼

java中可以呼叫本地指令碼,也可以遠端呼叫shell指令碼,但是java呼叫遠端指令碼不安全,一般不這麼做,那該怎麼呼叫呢? 建議在本地寫個指令碼呼叫遠端指令碼,在java程式中呼叫本地指令碼,具體程式碼: private int execShell(String shellPa

在asp.net呼叫Office來製作各種(3D)統計圖

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!