我有一个复杂的视图,其中包含几个子视图,如文本视图和图像视图。 我想用另一个(衍生的)图像视图替换其中的一个图像视图(另一个支持在后台加载图像)。
我该如何用新的图像视图替换原始的图像视图?
我目前的解决方案是复制整个 XML 布局,并在新的 XML 中进行替换 - 这样做很糟糕,因为会复制并且不重用东西 :(
我有一个复杂的视图,其中包含几个子视图,如文本视图和图像视图。 我想用另一个(衍生的)图像视图替换其中的一个图像视图(另一个支持在后台加载图像)。
我该如何用新的图像视图替换原始的图像视图?
我目前的解决方案是复制整个 XML 布局,并在新的 XML 中进行替换 - 这样做很糟糕,因为会复制并且不重用东西 :(
我不太确定我理解你的意思,但如果你只想从布局中删除一个View实例并将其替换为另一个,则可以使用这样的实用程序类:
import android.view.View;
import android.view.ViewGroup;
public class ViewGroupUtils {
public static ViewGroup getParent(View view) {
return (ViewGroup)view.getParent();
}
public static void removeView(View view) {
ViewGroup parent = getParent(view);
if(parent != null) {
parent.removeView(view);
}
}
public static void replaceView(View currentView, View newView) {
ViewGroup parent = getParent(currentView);
if(parent == null) {
return;
}
final int index = parent.indexOfChild(currentView);
removeView(currentView);
removeView(newView);
parent.addView(newView, index);
}
}
后续问题:当您说“复制而不重用非常糟糕”时,您的意思是什么?您是否知道包含标签?
include
是很好的选择。在这里,我想以编程方式替换另一个视图,而不是在编译时进行替换。 - AlikElzin-kilakareplaceView
中将newView
添加到父视图之前,复制当前视图的id可能会很有用:newView.setId(currentView.getId());
这样findViewById
就会返回newView
。 - Frederic Kleinindex
只适用于LinearLayout
,而对于RelativeLayout
需要做一些不同的事情:newView.setLayoutParams(currentView.getLayoutParams());
。另外,在关于@FredericKlein的id
方面,将会遗漏onClick
。 - MikeL