Android View附加到Activity事件的存在?

时间:2013-06-20 01:33:17

标签: android events view fonts listener

我在文档中查找某种事件,该事件允许我检测何时创建视图或视图何时附加到活动,视图层次结构中的任何位置,无论是一级深度还是多层深。

这样的方法非常理想,无论是在Activity级别,Window级别还是Window.DecorView级别:

void ViewAttachedToActivity(View view)
{
    ... //triggered each time an individual view is added to activity
}

重要的是我希望能够从Activity的上下文中检测到这个事件,而不是从子视图本身的上下文中检测到。

下面是我正在努力完成的一个粗略演示。我想知道是否存在更有效的方法:

P.S。我知道我可以通过继承所有文本控件(如TextView,EditText,Button等)来完成自定义字体部分,并使用它们而不是库存控件,但我正在寻找一个简单的解决方法,可以帮助我避免这种情况。

(请原谅这个代码是用C#编写的,使用Mono for Android,它应该很容易理解并精神上转换为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);
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我不认为这样的事件存在