我有一个复杂的“浮动视图”层次结构,我在不同的活动之间移动。由于这些视图是跨活动共享的,它们都应该有一个MutableContextWrapper
允许它们更改基本上下文的视图。理论上我可以同时拥有多个浮动视图。
以下是浮动视图的示例 XML:
<com.test.views.SampleFloatingView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/sample_floating_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<com.test.views.MinimizedImage
android:layout_width="90dp"
android:layout_height="90dp"
android:scaleType="center"/>
</com.test.views.SampleFloatingView>
我正在使用 a 对这个 XML 进行膨胀MutableContextWrapper
并将其添加到将容纳它的 FrameLayout 中(这样我就可以将它拖过屏幕),但我没有得到我需要的结果:
@NonNull
private FrameLayout createSampleFloatingView() {
MutableContextWrapper mutableContextWrapper = new MutableContextWrapper(getActivity());
final FrameLayout view = new FrameLayout(mutableContextWrapper);
LayoutInflater layoutInflater = LayoutInflater.from(mutableContextWrapper);
View floatingView = layoutInflater.inflate(R.layout.sample_floating_view, null, true).findViewById(R.id.sample_floating_view);
setViewMutableContext(floatingView);
view.addView(floatingView);
return view;
}
private void setViewMutableContext(View view) {
Context context = view.getContext();
if (context instanceof MutableContextWrapper) {
((MutableContextWrapper) context).setBaseContext(getActivity());
} else {
throw new RuntimeException("View " + view + " doesn't have a MutableContextWrapper");
}
if (view instanceof ViewGroup) {
int childCount = ((ViewGroup) view).getChildCount();
for (int i = 0; i < childCount; i++) {
setViewMutableContext(((ViewGroup) view).getChildAt(i));
}
}
}
问题在于,虽然FrameLayout
具有MutableContextWrapper
膨胀对象的上下文是创建视图的 Activity。这意味着上面的代码因为SampleFloatingView
没有MutableContextWrapper
. 如果我删除此代码,一旦我将视图与原始活动断开连接并将其移动到下一个活动,稍后就会发生内存泄漏。
这个问题的一个明显解决方案是手动创建整个层次结构并MutableContextWrapper
在构造函数中传递 (就像我为 做的那样FrameLayout
),但出于明显的原因我宁愿避免它。
我的问题是是否有更好的方法可以让我从 XML 扩展视图并强制它们的上下文指向MutableContextWrapper
?