我创建了一个非常小的库来更改我的应用程序的字体。
到目前为止,我一直在为布局膨胀之后以及在将TextView添加到布局之后更改字体。它可以工作,但我必须记住,对于涉及TextView
的布局中的每一个更改都要执行此操作。对于大型项目和我的代码的长期维护而言,这是不可持续的。
我想要一种方法来监听Activity
的布局变化,这样我就可以在那里进行字体更改。
我尝试在我的ViewGroup.OnHierarchyChangeListener
上实施Activity
,如下所示:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
.findViewById(android.R.id.content)).getChildAt(0);
viewGroup.setOnHierarchyChangeListener(this);
}
这似乎是一个很好的解决方案,因为我可以听取onChildViewAdded(View parent, View child)
并获取对我View
中添加的ViewGroup
内容的引用。唯一的问题是,这种获取viewGroup的方法并不包含ActionBar,但只需将同一个侦听器添加到ActionBar
即可。
但是,永远不会调用onChildViewAdded
。
我在Fragment
的布局中进行了大多数Activity
次交易。我不知道这是否阻止了回调的发生。
我现在正在尝试使用ViewTreeObserver.OnDrawListener
,这是可行的方法,还是有另一种解决方法来监听ViewGroup
中的更改?
答案 0 :(得分:1)
view.setOnHierarchyChangeListener()仅在将视图专门添加到此视图时为您提供回调。当您向此视图的子项添加视图时,您将无法获得任何回调。你需要单独听他们。
查看https://gist.github.com/JakeWharton/7189309处的代码:
每当向其中添加视图时,请为所有ViewGroup类型的子级添加一个侦听器以进行层次结构更改。
听众中的这段代码演示了这个想法:
@Override public void onChildViewAdded(View parent, View child) {
delegate.onChildViewAdded(parent, child);
if (child instanceof ViewGroup) {
ViewGroup childGroup = (ViewGroup) child;
childGroup.setOnHierarchyChangeListener(this);
for (int i = 0; i < childGroup.getChildCount(); i++) {
onChildViewAdded(childGroup, childGroup.getChildAt(i));
}
}
}