下面列出了android.support.v4.app.Fragment#getUserVisibleHint ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
/**
* 根据栈参数获取顶层可见fragment
*
* @param fragmentManager fragment管理器
* @param parentFragment 父fragment
* @param isInStack 是否是栈中的
* @return 栈中顶层可见fragment
*/
private static Fragment getTopShowFragmentIsInStack(@NonNull final FragmentManager fragmentManager,
final Fragment parentFragment,
final boolean isInStack) {
List<Fragment> fragments = getFragments(fragmentManager);
if (fragments.isEmpty()) return parentFragment;
for (int i = fragments.size() - 1; i >= 0; --i) {
Fragment fragment = fragments.get(i);
if (fragment != null && fragment.isResumed() && fragment.isVisible() && fragment.getUserVisibleHint()) {
if (isInStack) {
if (fragment.getArguments().getBoolean(ARGS_IS_ADD_STACK)) {
return getTopShowFragmentIsInStack(fragment.getChildFragmentManager(), fragment, true);
}
} else {
return getTopShowFragmentIsInStack(fragment.getChildFragmentManager(), fragment, false);
}
}
}
return parentFragment;
}
/**
* 处理fragment回退键
* <p>如果fragment实现了OnBackClickListener接口,返回{@code true}: 表示已消费回退键事件,反之则没消费</p>
* <p>具体示例见FragmentActivity</p>
*
* @param fragmentManager fragment管理器
* @return 是否消费回退事件
*/
public static boolean dispatchBackPress(@NonNull final FragmentManager fragmentManager) {
List<Fragment> fragments = fragmentManager.getFragments();
if (fragments == null || fragments.isEmpty()) return false;
for (int i = fragments.size() - 1; i >= 0; --i) {
Fragment fragment = fragments.get(i);
if (fragment != null
&& fragment.isResumed()
&& fragment.isVisible()
&& fragment.getUserVisibleHint()
&& fragment instanceof OnBackClickListener
&& ((OnBackClickListener) fragment).onBackClick()) {
return true;
}
}
return false;
}
/**
* 根据栈参数获取顶层可见fragment
*
* @param fragmentManager fragment管理器
* @param parentFragment 父fragment
* @param isInStack 是否是栈中的
* @return 栈中顶层可见fragment
*/
private static Fragment getTopShowFragmentIsInStack(@NonNull FragmentManager fragmentManager,
Fragment parentFragment,
boolean isInStack) {
List<Fragment> fragments = getFragments(fragmentManager);
if (fragments.isEmpty())
return parentFragment;
for (int i = fragments.size() - 1; i >= 0; --i) {
Fragment fragment = fragments.get(i);
if (fragment != null && fragment.isResumed() && fragment.isVisible() && fragment.getUserVisibleHint()) {
if (isInStack) {
if (fragment.getArguments().getBoolean(ARGS_IS_ADD_STACK)) {
return getTopShowFragmentIsInStack(fragment.getChildFragmentManager(), fragment, true);
}
} else {
return getTopShowFragmentIsInStack(fragment.getChildFragmentManager(), fragment, false);
}
}
}
return parentFragment;
}
/**
* 处理fragment回退键
* <p>如果fragment实现了OnBackClickListener接口,返回{@code true}: 表示已消费回退键事件,反之则没消费</p>
* <p>具体示例见FragmentActivity</p>
*
* @param fragmentManager fragment管理器
* @return 是否消费回退事件
*/
public static boolean dispatchBackPress(@NonNull FragmentManager fragmentManager) {
List<Fragment> fragments = fragmentManager.getFragments();
if (fragments == null || fragments.isEmpty())
return false;
for (int i = fragments.size() - 1; i >= 0; --i) {
Fragment fragment = fragments.get(i);
if (fragment != null
&& fragment.isResumed()
&& fragment.isVisible()
&& fragment.getUserVisibleHint()
&& fragment instanceof OnBackClickListener
&& ((OnBackClickListener) fragment).onBackClick()) {
return true;
}
}
return false;
}
@Nullable
private Fragment getSupportTopFragment(FragmentManager manager) {
List<Fragment> fragments = manager.getFragments();
if (fragments == null) {
return null;
}
int size = fragments.size();
for (int i = size - 1; i >= 0; i--) {
Fragment f = fragments.get(i);
if (f.isAdded() && !f.isHidden() && f.getUserVisibleHint()) {
Fragment tTopFragment = getSupportTopFragment(f.getChildFragmentManager());
return tTopFragment == null ? f : tTopFragment;
}
}
return null;
}
/**
* 根据栈参数获取顶层可见fragment
*
* @param fragmentManager fragment管理器
* @param parentFragment 父fragment
* @param isInStack 是否是栈中的
* @return 栈中顶层可见fragment
*/
private static Fragment getTopShowFragmentIsInStack(@NonNull FragmentManager fragmentManager,
Fragment parentFragment,
boolean isInStack) {
List<Fragment> fragments = getFragments(fragmentManager);
if (fragments.isEmpty()) return parentFragment;
for (int i = fragments.size() - 1; i >= 0; --i) {
Fragment fragment = fragments.get(i);
if (fragment != null && fragment.isResumed() && fragment.isVisible() && fragment.getUserVisibleHint()) {
if (isInStack) {
if (fragment.getArguments().getBoolean(ARGS_IS_ADD_STACK)) {
return getTopShowFragmentIsInStack(fragment.getChildFragmentManager(), fragment, true);
}
} else {
return getTopShowFragmentIsInStack(fragment.getChildFragmentManager(), fragment, false);
}
}
}
return parentFragment;
}
/**
* 处理fragment回退键
* <p>如果fragment实现了OnBackClickListener接口,返回{@code true}: 表示已消费回退键事件,反之则没消费</p>
* <p>具体示例见FragmentActivity</p>
*
* @param fragmentManager fragment管理器
* @return 是否消费回退事件
*/
public static boolean dispatchBackPress(@NonNull FragmentManager fragmentManager) {
List<Fragment> fragments = fragmentManager.getFragments();
if (fragments == null || fragments.isEmpty()) return false;
for (int i = fragments.size() - 1; i >= 0; --i) {
Fragment fragment = fragments.get(i);
if (fragment != null
&& fragment.isResumed()
&& fragment.isVisible()
&& fragment.getUserVisibleHint()
&& fragment instanceof OnBackClickListener
&& ((OnBackClickListener) fragment).onBackClick()) {
return true;
}
}
return false;
}
/**
* 处理fragment回退键
* <p>如果fragment实现了OnBackClickListener接口,返回{@code true}: 表示已消费回退键事件,反之则没消费</p>
* <p>具体示例见FragmentActivity</p>
*
* @param fragmentManager fragment管理器
* @return 是否消费回退事件
*/
public static boolean dispatchBackPress(@NonNull FragmentManager fragmentManager) {
List<Fragment> fragments = fragmentManager.getFragments();
if (fragments == null || fragments.isEmpty()) {
return false;
}
for (int i = fragments.size() - 1; i >= 0; --i) {
Fragment fragment = fragments.get(i);
if (fragment != null
&& fragment.isResumed()
&& fragment.isVisible()
&& fragment.getUserVisibleHint()
&& fragment instanceof OnBackClickListener
&& ((OnBackClickListener) fragment).onBackClick()) {
return true;
}
}
return false;
}
private static Fragment getTopShowIsInStack(@NonNull final FragmentManager fm,
Fragment parentFragment,
final boolean isInStack) {
List<Fragment> fragments = getFragments(fm);
for (int i = fragments.size() - 1; i >= 0; --i) {
Fragment fragment = fragments.get(i);
if (fragment != null
&& fragment.isResumed()
&& fragment.isVisible()
&& fragment.getUserVisibleHint()) {
if (isInStack) {
Bundle args = fragment.getArguments();
if (args != null && args.getBoolean(ARGS_IS_ADD_STACK)) {
return getTopShowIsInStack(fragment.getChildFragmentManager(), fragment, true);
}
} else {
return getTopShowIsInStack(fragment.getChildFragmentManager(), fragment, false);
}
}
}
return parentFragment;
}
@Nullable
private List<Fragment> getSupportTopFragments() {
if (manager == null) {
return null;
}
List<Fragment> fragments = manager.getFragments();
List<Fragment> topFragments = new ArrayList<>();
if (fragments == null) {
return null;
}
int size = fragments.size();
for (int i = size - 1; i >= 0; i--) {
Fragment f = fragments.get(i);
if (f.isAdded() && !f.isHidden() && f.getUserVisibleHint()) {
Fragment t = getSupportTopFragment(f.getChildFragmentManager());//递归
if (t != null) {
topFragments.add(t);
} else {
topFragments.add(f);
}
}
}
return topFragments;
}
public void activityCreated() {
if (DEBUG) {
Log.d(TAG, fragmentName + ": activityCreated, userVisibleHint=" + fragment.getUserVisibleHint());
}
if (fragment.getUserVisibleHint()) {
Fragment parentFragment = fragment.getParentFragment();
if (parentFragment != null && !parentFragment.getUserVisibleHint()) {
if (DEBUG) {
Log.d(TAG, fragmentName + ": activityCreated, parent " + parentFragment.getClass().getSimpleName() + " is hidden, therefore hidden self");
}
userVisibleCallback.setWaitingShowToUser(true);
userVisibleCallback.callSuperSetUserVisibleHint(false);
}
}
}
/**
* Attach Fragment
*/
@Override public void onViewAttachedToWindow(@NonNull FragmentViewHolder holder) {
String name = makeFragmentName(holder.itemView.getId(), holder.getAdapterPosition());
Fragment fragment = mFragmentManager.findFragmentByTag(name);
if (fragment != null && fragment == holder.currentFragment) {
// Nothing Changed
} else {
FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
if (fragment != null) {
fragmentTransaction.attach(fragment);
} else {
fragment = getItem(holder.getAdapterPosition());
fragmentTransaction.add(holder.itemView.getId(), fragment, name);
}
fragmentTransaction.commitNowAllowingStateLoss();
if (holder.currentFragment != null && holder.currentFragment.getUserVisibleHint()) {
holder.currentFragment.setMenuVisibility(false);
holder.currentFragment.setUserVisibleHint(false);
}
holder.currentFragment = fragment;
if (!fragment.getUserVisibleHint()) {
fragment.setMenuVisibility(true);
fragment.setUserVisibleHint(true);
}
}
}
/**
* 判断Fragment是否处理了Back键
*
* @return 如果处理了back键则返回 <b>true</b>
*/
public static boolean isFragmentBackHandled(Fragment fragment) {
return fragment != null
&& fragment.isVisible()
&& fragment.getUserVisibleHint() //for ViewPager
&& fragment instanceof HandleBackInterface
&& ((HandleBackInterface) fragment).onBackPressed();
}
@Override
public void onFragmentResumed(@NonNull FragmentManager fm, @NonNull Fragment f) {
super.onFragmentResumed(fm, f);
if (!f.isHidden() && f.getUserVisibleHint()) {
onVisibleChanged(f, true);
}
LogUtil.i(f.getClass().getSimpleName() + " onFragmentResumed");
}
/**
* 判断Fragment是否处理了Back键
*
* @return 如果处理了back键则返回 <b>true</b>
*/
public static boolean isFragmentBackHandled(Fragment fragment) {
return fragment != null
&& fragment.isVisible()
&& fragment.getUserVisibleHint() //for ViewPager
&& fragment instanceof FragmentBackHandler
&& ((FragmentBackHandler) fragment).onBackPressed();
}
/**
* Dispatch the back press for fragment.
*
* @param fragment The fragment.
* @return {@code true}: the fragment consumes the back press<br>{@code false}: otherwise
*/
public static boolean dispatchBackPress(@NonNull final Fragment fragment) {
return fragment.isResumed()
&& fragment.isVisible()
&& fragment.getUserVisibleHint()
&& fragment instanceof OnBackClickListener
&& ((OnBackClickListener) fragment).onBackClick();
}
/**
* 当前Fragment是否可见
*/
private boolean isFragmentVisible(Fragment fragment) {
return !fragment.isHidden() && fragment.getUserVisibleHint();
}
private boolean isFragmentVisible(Fragment fragment){
return fragment.getUserVisibleHint()&&!fragment.isHidden();
}
/**
* 检查fragment是否还存在
*/
public static boolean isFragmentLive(Activity activity, Fragment fragment) {
return fragment.getUserVisibleHint() && OkUtils.isActivityLive(activity);
}
boolean isVisible(Fragment fragment) {
if (mock) return true;
return fragment.getUserVisibleHint();
}