Android中Navigation的使用
一、页面导航:A–>B–>C
页面从A到B,有B到C,然后由C返回A时的写法
页面B在xml中的配置
<fragment
android:id="@+id/B"
android:name="xxx.VerificationPhoneFragment"
android:label="@string/VerificationPhoneFragment"
tools:layout="@layout/fragment_verification_phone">
<action
android:id="@+id/action_B_to_C"
app:destination="@id/C"
app:popUpTo="@id/B"
app:popUpToInclusive="true"
/>
</fragment>
二、在Activity中获取当前的Fragment对象
- java中
public Fragment getFragment(Class<?> clazz) {
List<Fragment> fragments = getSupportFragmentManager().getFragments();
if (fragments!= null && fragments.size() > 0) {
NavHostFragment navHostFragment = (NavHostFragment) fragments.get(0);
List<Fragment> childfragments = navHostFragment.getChildFragmentManager().getFragments();
if(childfragments != null && childfragments.size() > 0){
for (int j = 0; j < childfragments.size(); j++) {
Fragment fragment = childfragments.get(j);
if(fragment.getClass().isAssignableFrom(clazz)){
Log.i(TAG, "getFragment1: " + fragment);
return fragment;
}
}
}
}
return null;
}
- kotlin中
private fun <F : Fragment> getFragment(fragmentClass: Class<F>): F? {
val navHostFragment = this.supportFragmentManager.fragments.first() as NavHostFragment
navHostFragment.childFragmentManager.fragments.forEach {
if (fragmentClass.isAssignableFrom(it.javaClass)) {
return it as F
}
}
return null
}
三、Fragment中onActivityResult的调用
在这个Fragment所以的Activity的onActivityResult中获取当前的Fragment对象,再调用这个对象的onActivityResult方法。
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
val myPersonInfoFragment:MyPersonInfoFragment= getFragment(MyPersonInfoFragment::class.java)!!
myPersonInfoFragment.onActivityResult(requestCode, resultCode, data)
}
如果有多个Fragment都需要调用onActivityResult的方法,则可以在循环中调用。
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
val navHostFragment = this.supportFragmentManager.fragments.first() as NavHostFragment
val listFragments = navHostFragment.childFragmentManager.fragments
for(item:Fragment in listFragments){
if(item is MyPersonInfoFragment){
item.onActivityResult(requestCode, resultCode, data)
}else if(item is FeedBackFragment){
item.onActivityResult(requestCode, resultCode, data)
}
}
}