Android隐藏了虚增的视图

时间:2012-06-28 16:51:21

标签: android android-layout android-view

我有4个视图由1个SherlockMapActivity控制。目前,我通过removeAllViews()在选项卡之间切换选项卡,然后再次重新膨胀视图。这种接缝就像是一种非常低效的方式。

有没有办法只是“隐藏”已经膨胀的视图并将新视图重新定位到前端?我已尝试过setVisibility等的每个变体都无济于事。以下是我现在的处理方式:

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    //load our views!
    this.baseViewGroup = (ViewGroup)this.findViewById(android.R.id.content);

    this.mapView = new MapView(ActivityMain.this, MAP_API_KEY);
    this.mapView.setClickable(true);

    this.createMenu();
}

@Override
public void onTabSelected(Tab tab, FragmentTransaction ft)
{
    Log.v(CLASS_NAME, "tab selected: "+tab.getPosition());

    if (0 == tab.getPosition())
    {
        this.baseViewGroup.removeAllViews();
        this.getLayoutInflater().inflate(R.layout.map, this.baseViewGroup);
    }
    else if (1 == tab.getPosition())
    {
        this.baseViewGroup.removeAllViews();
        this.getLayoutInflater().inflate(R.layout.list, this.baseViewGroup);
    }
}

然后,我可以使用ViewControllers(各种类型)做一些奇特的事情,以便在重新创建时重新启动视图的先前状态,但这只是疯狂。有更好的方法吗?

修改 我已经尝试保存视图(膨胀一次,删除但只是重新添加)但我得到这种奇怪的行为。基本上,所有膨胀的视图以半透明的方式显示在彼此之上。没有任何setVisibility()可以让它们完全消失。

我尝试的代码(在适当的地方添加到onCreate()和onTabSelected()):

//in onCreate()
this.mapLayout = this.getLayoutInflater().inflate(R.layout.map, this.baseViewGroup);
this.moreLayout = this.getLayoutInflater().inflate(R.layout.more, this.baseViewGroup);

//in onTabSelected()
ViewGroup content = (ViewGroup)this.mapLayout.getParent();
content.removeAllViews();
content.addView(this.mapLayout);

1 个答案:

答案 0 :(得分:1)

Donot一次又一次地夸大观点。相反,有4个类级视图变量,如

private View firstView;
private View secondView;
private View thirdView;
private View fourthView;

现在在每个标签更改/按下期间。从父项中删除所有子视图,并向父项添加适当的视图。等,

parentView.removeAllViews();
parentView.addView(secondView);

修改

为parentView传递null。

而不是这个,

this.moreLayout = this.getLayoutInflater().inflate(R.layout.more, this.baseViewGroup);

这样做,

this.moreLayout = this.getLayoutInflater().inflate(R.layout.more, null);