using Android.App; using Android.OS; using Android.Views.InputMethods; using Android.Widget; using AndroidX.Fragment.App; using AndroidX.Navigation.Fragment; using System.Diagnostics.CodeAnalysis; using Fragment = AndroidX.Fragment.App.Fragment; // ReSharper disable once CheckNamespace namespace System { /// /// 扩展 /// public static class ActivityExtensions { #region 显示隐藏软键盘 (Show/Hide)SoftInput /// /// 隐藏软键盘 /// /// public static void HideSoftInput(this Activity activity) { var windowToken = (activity.CurrentFocus ?? activity.Window?.DecorView)?.WindowToken; if (windowToken != null) { var imm = activity.GetSystemService(); if (imm != null) { imm.HideSoftInputFromWindow(windowToken, HideSoftInputFlags.NotAlways); } } } /// /// 显示软键盘 /// /// /// /// 是否在中调用 public static void ShowSoftInput(this Activity activity, EditText editText, bool inOnCreate = false) { var imm = activity.GetSystemService(); if (imm != null) { if (inOnCreate) { if (activity.Window != null) { activity.Window.DecorView.PostDelayed(ShowSoftInput, 100); } else { new Handler().PostDelayed(ShowSoftInput, 100); } } else { ShowSoftInput(); } void ShowSoftInput() { editText.Focusable = true; editText.RequestFocus(); imm.ShowSoftInput(editText, 0); } } } #endregion #region 导航相关 AndroidX.Navigation /// /// 在 Activity 中 即时获取由 AndroidX.Navigation 管理的当前 Fragment /// /// /// /// [return: MaybeNull] public static TFragment GetPrimaryNavigationFragment( this FragmentActivity activity) where TFragment : Fragment { var fragments = activity.SupportFragmentManager.Fragments; if (fragments != null) { foreach (var fragment in fragments) { if (fragment is NavHostFragment navHostFragment) { var primaryNavigationFragment = navHostFragment .ChildFragmentManager.PrimaryNavigationFragment; if (primaryNavigationFragment is TFragment t) { return t; } } } } return null; } #endregion public static bool HasValue(this Activity? activity) { return activity != null && !activity.IsFinishing && !activity.IsDestroyed; } #if DEBUG [Obsolete("use HasValue", true)] public static bool IsAvailable(this Activity? activity) => activity.HasValue(); #endif } }