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
}
}