Tab内で、Activity 遷移の構成には注意

同じタブ画面(TabWidget)内で、複数 Activity を切り替える為に、ActivityGroup
使用する方法があるが、気をつけないとレイアウトで困ったことになる。

例として、、、
ActivityGroup で、切替え対象の Activity を表示させる コンテナのレイアウトを用意して、、

===== container.xml ======

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:orientation="vertical" >

</LinearLayout>

ActivityGroup 継承を以下の用意して、

public class TabParentActivityGroup extends ActivityGroup{
   private ViewGroup container;
   
   @Override
   protected void onCreate(Bundle savedInstanceState){
      super.onCreate(savedInstanceState);
      setContentView(R.layout.container);
      container = (ViewGroup)findViewById(R.id.container);
      // 初期表示
      showChild1();
   }
   public void showChild1(){
      container.removeAllViews();
      Intent intent = new Intent(this, TabChild1Activity.class);
      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
      Window window = getLocalActivityManager().startActivity("child1Activity",intent);
      container.addView(window.getDecorView());
   }
   public void showChild2(){
      container.removeAllViews();
      Intent intent = new Intent(this, TabChild2Activity.class);
      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
      Window window = getLocalActivityManager().startActivity("child2Activity",intent);
      container.addView(window.getDecorView());
   }
}

TabChild1Activity の中、ボタンクリックなどで、

*1.showChild2();

を実行するなど。。。

これは、遷移として動くことは動くが、画面レイアウトが以下のようになってしまう。


f:id:posturan:20160313225547p:plain



半分くらい切れてしまう。

これは、TabHost のコンテンツは、FramLayout だから当然なのだが、

そこで、fill_parent になるように、コンテナなどを使わずに setContentView を使う。

public class TabParentActivityGroup extends ActivityGroup{
   @Override
   protected void onCreate(Bundle savedInstanceState){
      super.onCreate(savedInstanceState);
      // 初期表示
      showChild1();
   }
   public void showChild1(){
      Intent intent = new Intent(this, TabChild1Activity.class);
      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
      Window window = getLocalActivityManager().startActivity("child1Activity",intent);
      setContentView(window.getDecorView());
   }
   public void showChild2(){
      Intent intent = new Intent(this, TabChild2Activity.class);
      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
      Window window = getLocalActivityManager().startActivity("child2Activity",intent);
      setContentView(window.getDecorView());
   }
}

*1:TabParentActivityGroup)getParent(