1

我有 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);
4

1 回答 1

1

不要一次又一次地夸大视图。相反,有 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);
于 2012-06-28T17:03:47.510 回答