如何在Android中以编程方式替换视图?

11

我有一个复杂的视图,其中包含几个子视图,如文本视图和图像视图。 我想用另一个(衍生的)图像视图替换其中的一个图像视图(另一个支持在后台加载图像)。

我该如何用新的图像视图替换原始的图像视图?

我目前的解决方案是复制整个 XML 布局,并在新的 XML 中进行替换 - 这样做很糟糕,因为会复制并且不重用东西 :(


1
我重复的借口:Google 没有找到它,即使我点了+1。嗯... - AlikElzin-kilaka
1个回答

35

我不太确定我理解你的意思,但如果你只想从布局中删除一个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-kilaka
2
小的补充:在replaceView中将newView添加到父视图之前,复制当前视图的id可能会很有用:newView.setId(currentView.getId()); 这样findViewById就会返回newView - Frederic Klein
是我还是index只适用于LinearLayout,而对于RelativeLayout需要做一些不同的事情:newView.setLayoutParams(currentView.getLayoutParams());。另外,在关于@FredericKlein的id方面,将会遗漏onClick - MikeL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接