1

1つのSherlockMapActivityによって制御される4つのビューがあります。現在、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 に答える