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