タブ レイアウトで新しい v2 マップフラグメントを使用する際に問題が発生した人はたくさんいます。マップが描画されないか、タブを移動して戻るとアプリがクラッシュします。(ここの例: 2 回目の SupportMapFragment を開く際のエラーとここ: Fragment 内の MapFragment、代替案? )
私が見た解決策は私にとってはうまくいきませんが、一番下にいくつかのタブが必要で、マップタブにはマップの上にドロップダウン、ボタン、その他の凝ったものが欲しいので、タブ内。
少しいじくり回した後、問題なく動作するように見える解決策を思いつきましたが、他の場所で言及されているのを見たことがなく、「ハック」側に少しあると感じているので、検証のために手を差し伸べています: )
1..ボタン、ドロップダウンなどを記述するlayout.xml(以下ではR.layout.mapと呼ばれます)を持っていますが、マップへの参照はまったくありません(xmlでマップフラグメントが定義されている他のほとんどのソリューションとは異なります)。
2.. 私の MainActivity には、多くの場所で詳述されているように、フラグメントを切り替えるための通常の tabhost/tabspec ルーチンがあります。
TabHost tabHost = (TabHost) findViewById(android.R.id.tabhost);
tabHost.setup();
addTab(this, tabHost, "home", R.string.label_tab_home, R.drawable.but_flag, MainFragment.class);
addTab(this, tabHost, "map", R.string.label_tab_map, R.drawable.but_globe, MapFragment.class);
.....
tabHost.setOnTabChangedListener(this);
3.. 私の MapFragment では、Fragment ではなく SupportMapFragment を拡張し、いくつかのファンキーな処理を行って、レイアウトを一番上に表示します。基本的に、SupportMapFragment クラスをレイアウトにキャストして、レイアウトをサブビューとして追加できるようにします。/
public class MapFragment extends SupportMapFragment{
...
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
FrameLayout mapView = (FrameLayout)super.onCreateView(inflater, container, savedInstanceState);
LinearLayout mapcomponents = (LinearLayout) inflater.inflate(R.layout.map, container, false);
mapView.addView(mapcomponents);
return mapView;
}
しばらくの間、いくつかの電話でこれを試してみましたが、うまくいくようです. ええ、2.1 をサポートする必要があります。
私が心配しているコードは、当然のことながら、SupportMapFragment の oncreateview から返されたビューを FrameLayout にキャストして、「コンポーネント」レイアウトを追加できるようにすることです。
この方法で問題はありますか?見逃したビューを追加する別の方法はありますか?
考えていただければ幸いです。