当相机活动返回时,承载这个片段的活动有它的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);
    }
}

当前回答

如果还有人做不到,我可以加两个建议。在Manifest.xml文件中,确保主机活动在回调时没有结束,并且要启动的活动具有标准的启动模式。 详情如下:

对于托管活动,如果有,则将no history属性设置为false

android:noHistory="false"

对于要启动的Activity,如果有,将启动模式设置为标准

android:launchMode="standard"

其他回答

简而言之,

在fragment中,声明fragment fragment = this;

之后使用fragment.startActivityForResult。

结果将在activityResult中返回。

如果在fragment类内部的onActivityResult方法有问题,并且你想要更新一些也在fragment类内部的东西,使用:

@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);
}

只要加上这个。变量,如上面代码所示。否则,该方法将在父活动中被调用,并且该变量不会在当前实例中更新。

我还通过将这段代码放到MainActivity中进行测试,用HomeFragment类替换它,并将变量设置为静态。我得到了我所期望的结果。

因此,如果你想让片段类拥有自己的onActivityResult实现,上面的代码示例就是答案。

我的问题是与主机活动,我发现它与一个设置android:launchMode=“标准”,我删除它临时,它工作!

对于那些使用Android导航组件的人,应该在Activity的onActivityResult(…)中使用primaryNavigationFragment来获取它的片段引用,并调用fragment的fragment.onActivityResult(…)

下面是Activity的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);
    }
}

大多数答案都说你必须在你的Fragment的宿主Activity中调用super.onActivityResult(…)。但这似乎对我不起作用。

所以,在你的主机活动中,你应该调用你的片段onActivityResult(…)。这里有一个例子。

public class HostActivity extends Activity {

    private MyFragment myFragment;

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

在HostActivity的某些时候,你需要分配这个。你正在使用的片段。或者,使用FragmentManager来获取Fragment,而不是在HostActivity中保留对它的引用。另外,在你尝试调用this.myFragment.onActivityResult(…);;