在新的嵌套片段 API 中未调用 onActivityResult() [英] onActivityResult() not called in new nested fragment API
问题描述
我一直在使用 Android 包含在支持中的新 嵌套片段 API图书馆.
I have been using the new nested fragment API that Android includes in the support library.
我在嵌套片段中面临的问题是,如果嵌套片段(即通过 getChildFragmentManager() 返回的
) 调用 FragmentManager
添加到另一个片段的片段)startActivityForResult()
,嵌套片段的 onActivityResult()
方法不被调用.但是,父片段的 onActivityResult()
和活动的 onActivityResult()
都会被调用.
The problem that I am facing with nested fragments is that, if a nested fragment (that is, a fragment that has been added to another fragment via the FragmentManager
returned by getChildFragmentManager()
) calls startActivityForResult()
, the nested fragment's onActivityResult()
method is not called. However, both the parent fragment's onActivityResult()
and activity's onActivityResult()
do get called.
我不知道我是否遗漏了有关嵌套片段的内容,但我没想到所描述的行为.下面是重现此问题的代码.如果有人能指出我正确的方向并向我解释我做错了什么,我将不胜感激:
I don't know if I am missing something about nested fragments, but I did not expect the described behavior. Below is the code that reproduces this problem. I would very much appreciate if someone can point me in the right direction and explain to me what I am doing wrong:
package com.example.nestedfragmentactivityresult;
import android.media.RingtoneManager;
import android.os.Bundle;
import android.content.Intent;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends FragmentActivity
{
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
this.getSupportFragmentManager()
.beginTransaction()
.add(android.R.id.content, new ContainerFragment())
.commit();
}
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
// This is called
Toast.makeText(getApplication(),
"Consumed by activity",
Toast.LENGTH_SHORT).show();
}
public static class ContainerFragment extends Fragment
{
public final View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState)
{
View result = inflater.inflate(R.layout.test_nested_fragment_container,
container,
false);
return result;
}
public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
getChildFragmentManager().beginTransaction()
.add(R.id.content, new NestedFragment())
.commit();
}
public void onActivityResult(int requestCode,
int resultCode,
Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
// This is called
Toast.makeText(getActivity(),
"Consumed by parent fragment",
Toast.LENGTH_SHORT).show();
}
}
public static class NestedFragment extends Fragment
{
public final View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState)
{
Button button = new Button(getActivity());
button.setText("Click me!");
button.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
startActivityForResult(intent, 0);
}
});
return button;
}
public void onActivityResult(int requestCode,
int resultCode,
Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
// This is NOT called
Toast.makeText(getActivity(),
"Consumed by nested fragment",
Toast.LENGTH_SHORT).show();
}
}
}
test_nested_fragment_container.xml 是:
test_nested_fragment_container.xml is:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</FrameLayout>
推荐答案
是的,嵌套片段中的onActivityResult()
不会被这种方式调用.
Yes, the onActivityResult()
in nested fragment will not be invoked by this way.
onActivityResult(Android支持库中)的调用顺序是
The calling sequence of onActivityResult (in Android support library) is
Activity.dispatchActivityResult()
.FragmentActivity.onActivityResult()
.Fragment.onActivityResult()
.
第三步,在父Activity
的FragmentMananger
中找到fragment.所以在你的例子中,它是被发现调度 onActivityResult()
的容器片段,嵌套片段永远无法接收事件.
In the 3rd step, the fragment is found in the FragmentMananger
of parent Activity
. So in your example, it is the container fragment that is found to dispatch onActivityResult()
, nested fragment could never receive the event.
我认为您必须在 ContainerFragment.onActivityResult()
中实现自己的调度,找到嵌套片段并调用将结果和数据传递给它.
I think you have to implement your own dispatch in ContainerFragment.onActivityResult()
, find the nested fragment and invoke pass the result and data to it.
这篇关于在新的嵌套片段 API 中未调用 onActivityResult()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!