托管此片段的活动在相机活动返回时调用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);
}
}
答案 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)
FragmentActivity
将requestCode
替换为onActivityResult()
。之后,当FragmentActivity
被调用时,Fragment
将解析更高的16位并恢复原始片段的索引。看看这个方案:
如果您在根级别有一些片段,则没有问题。但是,如果您有嵌套片段,例如ViewPager
requestCode
内有一些标签,则保证会面临问题(或已经面临它)。
因为只有一个索引存储在Fragment
中。这是FragmentManager
内FragmentManager
的索引。当我们使用嵌套片段时,有一些子FragmentManager
,它们有自己的片段列表。因此,从根{{1}}开始,保存整个索引链是必要的。
我们如何解决此问题?有一个常见的解决方法解决方案in this post。
答案 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属性设置为falseandroid: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)
在您的主要活动中:
@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)
您只需覆盖片段onActivityResult
上的BaseActivity baseActivity.startActivityForResult
。
在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);
}
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();
}
}
这种解决方法可以解决问题。
答案 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)。
因此,最正确和最可靠的方法似乎是从托管活动中实际调用 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)
如果您的启动模式设置为SingleInstance或SingleTask,则有一点没有人
mention
确保您的主机活动启动模式不能设置为singleInstance
或singleTask
。
onActivityResult将不起作用。或者使用这些IntentFilters调用您的活动
standard
或singleTop
启动模式可以正常使用。
答案 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");