ビューが作成されたとき、またはビューがアクティビティにアタッチされたとき、ビュー階層のどこにいても、それが 1 レベルの深さであるか複数のレベルの深さであるかを検出できる、ある種のイベントのドキュメントを探しています。 .
このようなメソッドは、アクティビティ レベル、ウィンドウ レベル、または Window.DecorView レベルのいずれかで理想的です。
void ViewAttachedToActivity(View view)
{
... //triggered each time an individual view is added to activity
}
重要な部分は、子ビュー自体のコンテキストからではなく、アクティビティのコンテキストからこのイベントを検出できるようにしたいということです。
以下は、私が達成しようとしていることの大まかなデモです。より効率的な方法が存在するかどうか疑問に思っています:
PS TextView、EditText、Button などのすべてのテキスト コントロールをサブクラス化することでカスタム フォント部分を実現し、ストック コントロールの代わりにそれらを使用できることはわかっていますが、それを回避するのに役立つ簡単な回避策を探しています。 .
(このコードは Android 用の Mono を使用して C# で書かれているという事実を許してください。理解するのは簡単で、精神的に Java に変換する必要があります)
public class BaseActivity : SherlockFragmentActivity
{
public Typeface Voltaire { get; set; }
bool pendingLayout = false;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
Voltaire = Typeface.CreateFromAsset(Assets, "fonts/voltaire-regular.ttf");
Window.DecorView.ViewTreeObserver.GlobalLayout += new EventHandler(ViewTreeObserver_GlobalLayout);
Window.DecorView.ViewTreeObserver.PreDraw += new EventHandler<ViewTreeObserver.PreDrawEventArgs>(ViewTreeObserver_PreDraw);
}
void ViewTreeObserver_GlobalLayout(object sender, EventArgs e)
{
pendingLayout = true;
}
void ViewTreeObserver_PreDraw(object sender, ViewTreeObserver.PreDrawEventArgs e)
{
if (pendingLayout)
{
pendingLayout = false;
SetTypeFace(Window.DecorView, Voltaire);
}
}
public void SetTypeFace(View view, Typeface typeface)
{
if (view is TextView)
{
((TextView)view).Typeface = typeface;
}
if (view is ViewGroup)
{
ViewGroup viewgroup = (ViewGroup)view;
for (int i = 0; i < viewgroup.ChildCount; i++)
{
SetTypeFace(viewgroup.GetChildAt(i), typeface);
}
}
}
}