片段中没有调用onActivityResult

时间:2011-05-27 04:35:19

标签: android android-fragments android-activity

托管此片段的活动在相机活动返回时调用onActivityResult

我的片段为结果启动了一个活动,其目的是让相机拍摄照片。图片应用程序加载正常,拍照并返回。然而,onActivityResult从未被击中。我设置了断点,但没有触发任何东西。片段可以onActivityResult吗?我想是因为它是一个提供的功能。为什么不被触发?

ImageView myImage = (ImageView)inflatedView.findViewById(R.id.image);
myImage.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View view) {
        Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(cameraIntent, 1888);
    }
});

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if( requestCode == 1888 ) {
        Bitmap photo = (Bitmap) data.getExtras().get("data");
        ((ImageView)inflatedView.findViewById(R.id.image)).setImageBitmap(photo);
    }
}

40 个答案:

答案 0 :(得分:1143)

托管活动会覆盖onActivityResult(),但未对未处理的结果代码调用super.onActivityResult()。显然,即使片段是进行startActivityForResult()调用的片段,活动也会获得处理结果的第一个镜头。当您考虑片段的模块化时,这是有意义的。一旦我为所有未处理的结果实现super.onActivityResult(),该片段就可以处理结果。

还来自@siqing的回答:

要在您的片段中获得结果,请务必在片段中调用startActivityForResult(intent,111);而不是getActivity().startActivityForResult(intent,111);

答案 1 :(得分:309)

我认为你打电话给getActivity().startActivityForResult(intent,111);。你应该致电startActivityForResult(intent,111);

答案 2 :(得分:228)

选项1:

如果您从片段中调用startActivityForResult(),则应调用startActivityForResult(),而不是getActivity().startActivityForResult(),因为它会导致片段onActivityResult()。

如果你不确定你在startActivityForResult()的哪个地方打电话,以及你将如何调用方法。

选项2:

由于Activity获得onActivityResult()的结果,您需要覆盖活动的onActivityResult()并调用super.onActivityResult()以传播到未处理的结果代码或所有的相应片段。

如果以上两个选项不起作用,请参阅选项3,因为它肯定会有效。

选项3:

从片段到onActivityResult函数的显式调用如下。

在父Activity类中,覆盖onActivityResult()方法,甚至覆盖Fragment类中的相同内容,并调用以下代码。

在父类中:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.dualPane);
    fragment.onActivityResult(requestCode, resultCode, data);
}

在儿童班:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // In fragment class callback
}

答案 3 :(得分:76)

如果您不知道活动中的片段,只需枚举它们并发送活动结果参数:

// In your activity
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    for (Fragment fragment : getSupportFragmentManager().getFragments()) {
        fragment.onActivityResult(requestCode, resultCode, data);
    }
}

答案 4 :(得分:74)

ChildFragmentManager我遇到了同样的问题。管理器不会将结果传递给嵌套片段,您必须在基本片段中手动完成。

public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);
    Fragment fragment = (Fragment) getChildFragmentManager().findFragmentByTag(childTag);
    if (fragment != null) {
        fragment.onActivityResult(requestCode, resultCode, intent);
    }
}

答案 5 :(得分:57)

Original post.

FragmentActivityrequestCode替换为onActivityResult()。之后,当FragmentActivity被调用时,Fragment将解析更高的16位并恢复原始片段的索引。看看这个方案:

Enter image description here

如果您在根级别有一些片段,则没有问题。但是,如果您有嵌套片段,例如ViewPager requestCode内有一些标签,则保证会面临问题(或已经面临它)。

因为只有一个索引存储在Fragment中。这是FragmentManagerFragmentManager的索引。当我们使用嵌套片段时,有一些子FragmentManager,它们有自己的片段列表。因此,从根{{1}}开始,保存整个索引链是必要的。

Enter image description here

我们如何解决此问题?有一个常见的解决方法解决方案in this post

GitHub:https://github.com/shamanland/nested-fragment-issue

答案 6 :(得分:41)

这是最受欢迎的问题之一。我们可以找到很多有关此问题的主题。但它们都不适合我。

所以我使用这个解决方案解决了这个问题。

让我们先了解为什么会这样。

我们可以直接从Fragment调用startActivityForResult但实际上后面的机制都由Activity处理。

从Fragment中调用 startActivityForResult 后,requestCode将更改为将Fragment的标识附加到代码中。这将使Activity能够追踪收到结果后发送此请求的人。

一旦Activity被导航回来,结果将被发送到Activity的onActivityResult,其中修改后的requestCode将被解码为原始requestCode + Fragment的标识。之后,Activity将通过onActivityResult将活动结果发送到该片段。这一切都已完成。

问题是:

Activity可以将结果仅发送到已直接附加到Activity而不是嵌套的Fragment。这就是为什么嵌套片段的onActivityResult永远不会被调用的原因。

解决方案:

1)通过以下代码在您的片段中启动Intent:

       /** Pass your fragment reference **/
       frag.startActivityForResult(intent, REQUEST_CODE); // REQUEST_CODE = 12345

2)现在在您的家长活动覆盖** onActivityResult() :**

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    }

您必须在父活动中调用此方法才能使其正常工作。

3)在您的片段调用中:

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == Activity.RESULT_OK) {

       }
}

就是这样。 使用此解决方案,它可以应用于任何单个片段,无论它是否嵌套。是的,它也涵盖了所有情况!此外,代码也很好,干净。

答案 7 :(得分:18)

适用于许多嵌套片段(例如,在片段中使用ViewPager时)

在您的主要活动中

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
}

在你的片段中:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    for (Fragment fragment : getChildFragmentManager().getFragments()) {
        fragment.onActivityResult(requestCode, resultCode, data);
    }
}

在您的嵌套片段中

致电活动

getParentFragment().startActivityForResult(intent, uniqueInstanceInt);

uniqueInstanceInt - 将其替换为嵌套片段中唯一的int,以防止其他片段处理答案。

收到回复

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == uniqueInstanceInt ) {
        // TODO your code
    }
}

<强>注意

在uniqueInstanceInt中需要使用介于0和65536之间的数字以避免错误&#34;对于requestCode&#34;只能使用低16位。

答案 8 :(得分:13)

如果有人仍然无法做到,我可以添加两个建议。在Manifest.xml文件中,确保在回调时托管活动未完成,并且要启动的活动将启动模式作为标准。 详情如下:

对于Hosting活动,如果有

,则将no history属性设置为false
android:noHistory="false"

对于要启动的活动,如果有

,则将启动模式设置为标准
android:launchMode="standard"

答案 9 :(得分:10)

我也在片段中遇到了这个问题。我在startActivityForResult中拨打DialogFragment

但现在这个问题已经解决:
FragmentClassname.this.startActivityForResult

答案 10 :(得分:9)

我将这段代码移到 Fragment 之外的 Utility Class ,同时将parentActivity传递给时,我也面临同样的问题>参数

Intent intent = new Intent(parentActivity, CameraCaptureActivity.class);
parentActivity.startActivityForResult(intent,requestCode);

然后我没有在片段onActivityResult方法中获得任何价值, 之后,我将参数更改为 Fragment ,因此修改后的方法定义看起来像,

Intent intent = new Intent(fragment.getContext(), CameraCaptureActivity.class);
fragment.startActivityForResult(intent,requestCode);

之后,我能够在片段上的onActivityResult获得价值

答案 11 :(得分:9)

Kotlin版本,适用于那些受Mohit Mehta的答案启发而使用Android导航组件的人

# 1.1. Load R packages 
library("tseries")
library("quantmod")
library("Quandl")
library("PortfolioAnalytics")
library("DEoptim")
library(ROI)
library(robustbase)
# 1.2. Data Reading
setwd("C:/Users/Win10/Desktop/Portfolio Analysis-20200406T063327Z-001/Portfolio Analysis")

bonds <- data[,2]
mbonds <- monthlyReturn(bonds,type="arithmetic")
colnames(moil) <- "mbonds"

stocks <- data[,3]
mstocks <- monthlyReturn(stocks,type="arithmetic")
colnames(moil) <- "mstoks"

oil <- data[,4]
moil <- monthlyReturn(oil,type="arithmetic")
colnames(moil) <- "moil"

gold <- data[,5]
mgold <- monthlyReturn(gold,type="arithmetic")
colnames(mgold) <- "mgold"


# 4.2.1. Portfolio Assets Returns Matrix
mport <- cbind(mbonds,mstocks,moil,mgold)

mport4 <- portfolio.spec(assets=colnames(mport))

# Portfolio Constraints
mport4c <- add.constraint(mport4,type="Box",min=0,max=1)
mport4c <- add.constraint(mport4,type="weight_sum",min_sum=0.99, max_sum=1.01)

# Portfolio Objectives
mport4c <- add.objective(mport4c,type="risk",name="CVaR",arguments=list(p = 0.95,clean="boudt"))

# Portfolio Optimization
mportopt4 <- optimize.portfolio(R=mport,portfolio=mport4c,optimize_method="DEoptim", search_size = 2000, trace=TRUE)

答案 12 :(得分:6)

解决方案1:

致电startActivityForResult(intent, REQUEST_CODE);而非getActivity().startActivityForResult(intent, REQUEST_CODE);

解决方案2:

调用startActivityForResult(intent, REQUEST_CODE);时,系统会调用活动的onActivityResult(requestCode,resultcode,intent),然后您可以从此处调用fragments onActivityResult(),并传递 requestCode, resultCode and intent 。< / p>

答案 13 :(得分:5)

简而言之,

在片段中,声明Fragment fragment = this;

之后使用fragment.startActivityForResult

结果将在activityResult中返回。

答案 14 :(得分:5)

在片段中,调用

this.startActivityForResult(intent, REQUEST_CODE);

其中this指的是片段。否则就像@Clevester所说:

Fragment fragment = this;
....
fragment.startActivityForResult(intent, REQUEST_CODE);

我也不得不打电话

super.onActivityResult(requestCode, resultCode, data);

在父活动的onActivityResult中使其有效。

(我根据@Clevester的回答改编了这个答案。)

答案 15 :(得分:5)

FOR NESTED FRAGMENTS(例如,使用ViewPager时)

在您的主要活动中:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
}

在主要顶级片段(ViewPager片段)中:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    YourFragment frag = (YourFragment) getChildFragmentManager().getFragments().get(viewPager.getCurrentItem());
    frag.yourMethod(data);  // Method for callback in YourFragment
    super.onActivityResult(requestCode, resultCode, data);
}

在YourFragment(嵌套片段)中:

public void yourMethod(Intent data){
    // Do whatever you want with your data
}

答案 16 :(得分:5)

在我的情况下,这是一个Android错误(http://technet.weblineindia.com/mobile/onactivityresult-not-getting-called-in-nested-fragments-android/),如果您使用支持的FragmentActivity,则必须使用getSupportFragmentManager而不是getChildFragmentManager

List<Fragment> fragments = getSupportFragmentManager().getFragments();
if (fragments != null) {
    for (Fragment fragment : fragments) {
        if(fragment instanceof UserProfileFragment) {
            fragment.onActivityResult(requestCode, resultCode, data);
        }
    }
}

答案 17 :(得分:3)

public class takeimage extends Fragment {

    private Uri mImageCaptureUri;
    private static final int PICK_FROM_CAMERA = 1;
    private static final int PICK_FROM_FILE = 2;
    private String mPath;
    private ImageView mImageView;
    Bitmap bitmap = null;
    View view;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.activity_send_image, container, false);
        final String[] items = new String[] { "From Camera", "From SD Card" };
        mImageView = (ImageView)view.findViewById(R.id.iv_pic);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.select_dialog_item, items);
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle("Select Image");

        builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int item) {
                if (item == 0) {
                    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    File file = new File(Environment.getExternalStorageDirectory(), "tmp_avatar_"
                        + String.valueOf(System.currentTimeMillis())
                        + ".jpg");
                    mImageCaptureUri = Uri.fromFile(file);

                    try {
                        intent.putExtra(
                            android.provider.MediaStore.EXTRA_OUTPUT,
                            mImageCaptureUri);
                        intent.putExtra("return-data", true);

                        getActivity().startActivityForResult(intent,
                            PICK_FROM_CAMERA);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                    dialog.cancel();
                } else {
                    Intent intent = new Intent();

                    intent.setType("image/*");
                    intent.setAction(Intent.ACTION_GET_CONTENT);

                    getActivity().startActivityForResult(
                        Intent.createChooser(intent,
                            "Complete action using"), PICK_FROM_FILE);
                }
            }
        });
        final AlertDialog dialog = builder.create();

        Button show = (Button) view.findViewById(R.id.btn_choose);
        show.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // Switch the tab content to display the list view.
                dialog.show();
            }
        });

    return view;
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {

        if (resultCode != Activity.RESULT_OK)
            return;

        if (requestCode == PICK_FROM_FILE) {
            mImageCaptureUri = data.getData();
            // mPath = getRealPathFromURI(mImageCaptureUri); //from Gallery

            if (mPath == null)
                mPath = mImageCaptureUri.getPath(); // from File Manager

            if (mPath != null)
                bitmap = BitmapFactory.decodeFile(mPath);
        } else {
            mPath = mImageCaptureUri.getPath();
            bitmap = BitmapFactory.decodeFile(mPath);
        }
        mImageView.setImageBitmap(bitmap);  
    }

    public String getRealPathFromURI(Uri contentUri) {
        String [] proj = {MediaStore.Images.Media.DATA};
        Cursor cursor = managedQuery(contentUri, proj, null, null,null);

        if (cursor == null) return null;

        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }
} 

答案 18 :(得分:3)

大多数答案一直表示您必须在主持人super.onActivityResult(...)中为Activity致电Fragment。但这似乎对我不起作用。

因此,在您的主人Activity中,您应该拨打Fragments onActivityResult(...)。这是一个例子。

public class HostActivity extends Activity {

    private MyFragment myFragment;

    protected void onActivityResult(...) {
        super.onActivityResult(...);
        this.myFragment.onActivityResult(...);
    }
}

HostActivity的某个时刻,您需要指定this.myFragment您正在使用的Fragment。或者,使用FragmentManager获取Fragment,而不是在HostActivity中保留对其的引用。另外,请在尝试拨打null之前检查this.myFragment.onActivityResult(...);

答案 19 :(得分:3)

  1. 您只需覆盖片段onActivityResult上的BaseActivity baseActivity.startActivityForResult

  2. 在BaseActivity上添加接口并覆盖onActivityResult。

    private OnBaseActivityResult baseActivityResult;
    public static final int BASE_RESULT_RCODE = 111;
    public interface OnBaseActivityResult{
        void onBaseActivityResult(int requestCode, int resultCode, Intent data);
       }
    }
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(getBaseActivityResult() !=null && requestCode == BASE_RESULT_RCODE){
        getBaseActivityResult().onBaseActivityResult(requestCode, resultCode, data);
        setBaseActivityResult(null);
    }
    
  3. On Fragment实现OnBaseActivityResult

    @Override
    public void onBaseActivityResult(int requestCode, int resultCode, Intent data) {
    Log.d("RQ","OnBaseActivityResult");
    if (data != null) {
        Log.d("RQ","OnBaseActivityResult + Data");
        Bundle arguments = data.getExtras();
      }
    }
    
  4. 这种解决方法可以解决问题。

答案 20 :(得分:3)

如果 Facebook登录遇到上述问题,那么您可以在片段的父活动中使用以下代码,如:

Fragment fragment = getFragmentManager().findFragmentById(android.R.id.tabcontent);
fragment.onActivityResult(requestCode, resultCode, data);

Fragment fragment = getFragmentManager().findFragmentById("fragment id here");
fragment.onActivityResult(requestCode, resultCode, data);

并在您的片段中添加以下调用...

callbackManager.onActivityResult(requestCode, resultCode, data);

答案 21 :(得分:3)

使用 Android的导航组件,此问题当您嵌套了片段时,可能会感觉像是一个无法解开的谜。

基于本文中以下答案的知识和启发,我设法组成了一个简单的有效解决方案:

在活动的onActivityResult()中,您可以循环浏览使用FragmentManager的{​​{1}}方法获得的活动片段列表。

请注意,为此,您需要使用getFragments()或定位到API 26及更高版本。

这里的想法是使用getSupportFragmentManager()遍历列表,检查列表中每个Fragment的实例类型。

不幸的是,虽然循环浏览此类型instanceof的列表是很理想的,但是当您使用Android导航组件时,该列表将只有一项,即Fragment

那现在呢?我们需要让NavHostFragment知道Fragments。 NavHostFragment本身就是一个片段。因此,使用NavHostFragment,我们再次获得getChildFragmentManager().getFragments()已知的List<Fragment>片段。我们遍历该列表,检查NavHostFragment每个片段。

在列表中找到感兴趣的片段后,我们将其称为instanceof,并将活动onActivityResult()声明的所有参数传递给它。

onActivityResult()

答案 22 :(得分:2)

其他答案中尚未描述的另一个用例:

使用onActivityResult()时不会调用片段中声明的

exception.startResolutionForResult()

if (exception is ResolvableApiException) {
    exception.startResolutionForResult(activity!!, MY_REQUEST_CODE)
}

在这种情况下,将exception.startResolutionForResult()替换为片段的startIntentSenderForResult()

if (exception is ResolvableApiException) {
    startIntentSenderForResult(exception.resolution.intentSender, MY_REQUEST_CODE, null, 0, 0, 0, null)
}

答案 23 :(得分:2)

kotlin版本(在您的活动onActivityResult()中)

 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    //add following lines in your activity
    if(supportFragmentManager?.fragments!=null && supportFragmentManager?.fragments!!.size>0)
     for (i in 0..supportFragmentManager?.fragments!!.size-1) {
         val fragment= supportFragmentManager?.fragments!!.get(i)
         fragment.onActivityResult(requestCode, resultCode, data)
    }
 }

答案 24 :(得分:1)

我强烈怀疑这里的所有答案都只是黑客攻击。我已经尝试过所有这些以及许多其他人,但没有任何可靠的结论,因为总会有某种愚蠢的问题。我一个人不能依赖不一致的结果。如果您查看片段的官方Android API文档,您会看到Google明确说明以下内容:

  

从包含Activity的片段中调用startActivityForResult(Intent,int)。

请参阅:Android Fragment API

因此,最正确和最可靠的方法似乎是从托管活动中实际调用 startActivityForResult(),并处理从中生成的 onActivityResult()那里。

答案 25 :(得分:1)

我的问题在于主机活动,我发现它有一个集合android:launchMode="standard"我暂时删除了它的工作!

答案 26 :(得分:1)

就我而言,在开发者选项中,我打开了“ 不保留活动”,这是导致此问题的原因。

以防万一。

答案 27 :(得分:1)

对于使用Android Navigation Component的用户,应在Activity的onActivityResult(...)中使用primaryNavigationFragment以获取其片段引用并调用片段的fragment.onActivityResult(...)

这里的活动的onActivityResult(...)

@Override
public void onActivityResult(int requestCode, int resultCode, Intent imageData)
{
    super.onActivityResult(requestCode, resultCode, imageData);

    for (Fragment fragment : getSupportFragmentManager().getPrimaryNavigationFragment().getChildFragmentManager().getFragments())
    {
            fragment.onActivityResult(requestCode, resultCode, imageData);
    }
}

答案 28 :(得分:1)

正如Ollie C所提到的,当您使用嵌套片段时,支持库存在使用返回值到onActivityResult的活动错误。我只是打了它: - (。

请参阅 Fragment.onActivityResult not called when requestCode != 0

答案 29 :(得分:1)

您的代码有一个嵌套片段。调用super.onActivityForResult不起作用

您不希望修改可以从中调用片段的每个活动,也不想调用片段链中的每个片段。

以下是众多工作解决方案之一。动态创建一个片段,并使用支持片段管理器将其直接连接到活动。然后从新创建的片段中调用startActivityForResult。

private void get_UserEmail() {

    if (view == null) {
        return;
    }
    ((TextView) view.findViewById(R.id.tvApplicationUserName))
            .setText("Searching device for user accounts...");

    final FragmentManager fragManager = getActivity().getSupportFragmentManager();

    Fragment f = new Fragment() {
        @Override
        public void onAttach(Activity activity) {
            super.onAttach(activity);
            startActivityForResult(AccountPicker.newChooseAccountIntent(null, null,
                    new String[]{"com.google"}, false, null, null, null, null), REQUEST_CODE_PICK_ACCOUNT);
        }

        @Override
        public void onActivityResult(int requestCode, int resultCode,
                                     Intent data) {
            if (requestCode == REQUEST_CODE_PICK_ACCOUNT) {
                String mEmail = "";
                if (resultCode == Activity.RESULT_OK) {
                    if (data.hasExtra(AccountManager.KEY_ACCOUNT_NAME)) {
                        mEmail = data
                                .getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
                    }
                }
                if (mActivity != null) {
                    GoPreferences.putString(mActivity, SettingApplication.USER_EMAIL, mEmail);
                }
                doUser();
            }
            super.onActivityResult(requestCode, resultCode, data);
            fragManager.beginTransaction().remove(this).commit();
        }
    };
    FragmentTransaction fragmentTransaction = fragManager
            .beginTransaction();
    fragmentTransaction.add(f, "xx" + REQUEST_CODE_PICK_ACCOUNT);
    fragmentTransaction.commit();
}

答案 30 :(得分:0)

首先,您需要在Activity中覆盖此代码;

 @Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
}

然后在您的片段中

startActivityForResult(intent,GALLERY_REQUEST_CODE);

再一次比您片段中的

@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    // Result code is RESULT_OK only if the user selects an Image
    if (resultCode == Activity.RESULT_OK) {

    }

}

答案 31 :(得分:0)

onActivityResult 现在已弃用。您可以使用以下代码:

   registerForActivityResult(ActivityResultContracts.StartActivityForResult()){ result->
    // here you can handle result, result.data and result.resultCode
   }

开始活动

    val intent = Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE)
    launcher.launch(intent)

答案 32 :(得分:0)

  

有一点没有人mention确保您的主机活动启动模式不能设置为singleInstancesingleTask

如果您的启动模式设置为SingleInstance或SingleTask,则

onActivityResult将不起作用。或者使用这些IntentFilters调用您的活动

standardsingleTop启动模式可以正常使用。

答案 33 :(得分:0)

最简单的方法之一是从片段中启动活动。

startActivity(ActivityName);

然后,在您的活动中添加致电startActivityForResult(intent,"1");并在您的活动中添加onActivityResult

startActivityForResult(intent,"1");

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.dualPane);
    fragment.onActivityResult(requestCode, resultCode, data);
// perform other activity result like fetching from Uris or handling cursors

finish(); // finish the activity will  get to back to your fragment.
}

答案 34 :(得分:0)

如果片段类中的方法onActivityResult出现问题,并且您想要更新片段类中的内容,请使用:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {

    if(resultCode == Activity.RESULT_OK)
    {
        // If the user had agreed to enabling Bluetooth,
        // populate the ListView with all the paired devices.
        this.arrayDevice = new ArrayAdapter<String>(this.getContext(), R.layout.device_item);
        for(BluetoothDevice bd : this.btService.btAdapater.getBondedDevices())
        {
            this.arrayDevice.add(bd.getAddress());
            this.btDeviceList.setAdapter(this.arrayDevice);
        }
    }
    super.onActivityResult(requestCode, resultCode, data);
}

只需添加this.variable,如上面的代码所示。否则,将在父活动中调用该方法,并且不会更新当前实例的变量。

我也通过将此代码块放入MainActivity,将this替换为HomeFragment类并将变量设置为静态来测试它。我得到了预期的结果。

因此,如果您希望片段类具有自己的onActivityResult实现,则上面的代码示例就是答案。

答案 35 :(得分:0)

如果您使用嵌套片段,这也有效:

getParentFragment().startActivityForResult(intent, RequestCode);

除此之外,您还必须从父活动中调用super.onActivityResult并填写片段的onActivityResult方法。

答案 36 :(得分:0)

只需使用以下代码即可获得片段。

@Override
public void onOtherButtonClick(ActionSheet actionSheet, int index) {

    if (index == 1)
    {
        Intent intent = new Intent(Intent.ACTION_PICK,
                                   android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        intent.setType("image/*");
        startActivityForResult(Intent.createChooser(intent,
                                                    "Select Picture"), 1);
     }
}

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == 1) {
        if (requestCode == 1) {
            Uri selectedImageUri = data.getData();
            //selectedImagePath = getPath(selectedImageUri);
        }
    }
}

onActivityResult将在不调用其父级的情况下调用。

答案 37 :(得分:0)

我只是制定了一种解决方法:

public static Fragment _tempFragment = null;
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(_tempFragment != null)
        _tempFragment.onActivityResult(requestCode, resultCode, data);
}

在你的片段中,在startActivityforResult之前,设置

MainActivity._tempFragment = this;

在片段

中的onActivityResult&lt; - 之后
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
     super.onActivityResult(requestCode, resultCode, data);

     // Do your job
     {

     }
     MainActivity._tempFragment = null;
}

答案 38 :(得分:0)

我已经通过编写扩展Fragment的基类来解决了这个问题,并且在活动的onactivityresult中我使用fragmenttag确定了当前正在运行的片段。然后我在fragmentbase类中调用用户定义的方法。这将在当前运行的片段中触发事件。

答案 39 :(得分:-5)

只需致电:

startActivityForResult(intent, "1");