アプリの構造は次のとおりです。
tabHost (in Activity) -> contains -> TabFragment(extend base container fragment)
1。アクティビティのコード:
tabHost.addTab(
tabHost.newTabSpec("home").setIndicator("",
getResources().getDrawable(R.drawable.btn_home)),
HomeFragment.class, null);
2。HomeFragmentのコード(HomeFragmentは実際の関数ではなく、このようなコンテナーであり、BaseContainerFragmentを拡張することに注意してください):
public class HomeFragment extends BaseContainerFragment {
public Home homeFrag;
private boolean mIsViewInited;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.container_fragment, null);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (!mIsViewInited) {
mIsViewInited = true;
initView();
}
}
private void initView() {
homeFrag = new Home();
replaceFragment(homeFrag, false);
}
}
。BaseContainerFragment
public class BaseContainerFragment extends Fragment {
public void replaceFragment(Fragment fragment, boolean addToBackStack) {
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
if (addToBackStack) {
transaction.addToBackStack(null);
}
transaction.replace(R.id.container_framelayout, fragment);
transaction.commit();
}
public boolean popFragment() {
boolean isPop = false;
if (getChildFragmentManager().getBackStackEntryCount() > 0) {
isPop = true;
getChildFragmentManager().popBackStack();
}
return isPop;
}
}
4。ホーム(フラグメントの実際のコンテンツ)
UploadType fragment = new UploadType();
Bundle bundle = new Bundle();
bundle.putString("form_type", "request");
fragment.setArguments(bundle);
((BaseContainerFragment)getParentFragment()).replaceFragment(fragment, true);
5。UploadTypeでは、カメラアクティビティを呼び出しますが、onActivityResultはメインアクティビティでのみ返されます。
startActivityForResult(intent, REQUEST_CAMERA);
public void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d("test1", "result2");
super.onActivityResult(requestCode, resultCode, data);
}
UploadTypeでonActivityResultをトリガーするにはどうすればよいですか?手伝ってくれてありがとう。
これが機能しない理由は、ネストされたフラグメント内からstartActivityForResult()
を呼び出しているためです。 Androidは、結果をActivity
およびFragment
にルーティングするのに十分スマートですが、ネストされたFragment
にはルーティングしないため、なぜコールバックを取得しません(それが機能しない理由の詳細 here または stackoverflow ))
これを機能させるために、コールバックをChildFragment
(= UploadType
)のParentFragment
(= BaseContainerFragment
)に手動でルーティングすることをお勧めします。
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Fragment uploadType = getChildFragmentManager().findFragmentById(R.id.container_framelayout);
if (uploadType != null) {
uploadType.onActivityResult(requestCode, resultCode, data);
}
super.onActivityResult(requestCode, resultCode, data);
}
私の場合、次のコードをMainActivity.Java
@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);
}
}
このようにあなたの活動オーバーライドでonActivityForResult()
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
今、あなたのフラグメントで、あなたはこれの中に活動結果を得ることができます
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d("test1", "result2");
}
フラグメントでstart ActivityForResultを呼び出すときは、次のようにしてください。
startActivityForResult(intent, REQUEST_CAMERA);
単一のアクティビティを使用していて、NavHostFragment
内にフラグメントがある場合、NavHostFragment
の子フラグメントのonActivityResult()
が呼び出されないという問題があります。
この問題を修正するには、ホストアクティビティのonActivityResult()
内から子フラグメントのonActivityResult()
を手動で呼び出す必要があります。ホストアクティビティは、NavHostFragment
をホストするアクティビティです。
以下は、ホストアクティビティのonActivityResult()
のKotlinコードです。
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
val navHostFragment = supportFragmentManager.findFragmentById(R.id.your_nav_Host_fragment)
val childFragments = navHostFragment?.childFragmentManager?.fragments
childFragments?.forEach { it.onActivityResult(requestCode, resultCode, data) }
}
TabActivity-> ActivityA-> FragmentB、それは動作しません。
悪い悪い悪い方法を使う:
ActivityA.Java
public void onSelectSomething(){
...
startActivityForResult(intent, 22222);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (mFragment != null) {
mFragment.onActivityResult(requestCode, resultCode, data);
}
}
FragmentB.Java
if(getActivity() instanceof ActivityA) {
((RepairerListActivity)getActivity()).onSelectSomething();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 22222) {
// do things
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Loop through all child fragments of the activity
for (Fragment fragment : getSupportFragmentManager().getFragments()) {
// check if the current fragment is YourFragment
if (fragment instanceof YourFragment ) {
fragment.onActivityResult(requestCode, resultCode, data);
}
}
}