0

Android タブレット アプリケーションに 2 つのペイン (左側のリストと右側の詳細) があります (設定のネイティブ タブレット アプリ ビューと同様)。MapActivity を MainActivity に拡張しました。左側に場所の詳細のリストがあります。フラグメントである右側のペインに各リスト項目の MapView を表示したかったのです。

問題は、Map View を開こうとするときです。最初のアイテムは mapView を開こうとしています。2 番目の項目以降は、1 つの MapActivity に対して 1 つの MapView しか開くことができないことを示しています。正しい答えを提案してください。関連するすべての投稿を試しましたが、成功しませんでした。

私のコードバージョン: Android 4.0

以下のコードを確認してください。

    MainActivity extends MapActivity {
    onCreate(){
                    LocationFragment loc_fragment=new LocationFragment();
                    FragmentTransaction xaction=VenueFragment.venueFrgMgr.beginTransaction();
                    Bundle sendData=new Bundle();
                    sendData.putString("LAT", s.getLat());
                    sendData.putString("LON", s.getLong());
                    sendData.putString("NAME", s.getName());
                    sendData.putString("ADD", s.getAddress());
                    loc_fragment.setArguments(sendData);
                    xaction.add(R.id.second_pane, loc_fragment,"location");
                    xaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);

                    xaction.addToBackStack(null);
                    xaction.commit();

   }
 @Override
protected boolean isRouteDisplayed() {

    return false;
}

}

MapView を示す LocationFragment のコードは次のとおりです。

    private ViewGroup mapContainer;
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            super.onCreateView(inflater, container, savedInstanceState);
            //view.refreshDrawableState();

            view = inflater.inflate(R.layout.location, container, false);
            mapContainer=new LinearLayout(getActivity());
            mapContainer.addView(view);
            v = view.findViewById(R.id.loading);
            v.setVisibility(View.VISIBLE);

    /*      lonstr=LocationActivity.lonstr;
            latstr=LocationActivity.latstr;
            name=LocationActivity.name;
            address=LocationActivity.address;
    */      
            ((Button) view.findViewById(R.id.back))
                    .setOnClickListener(new OnClickListener() {

                        @Override
                        public void onClick(View v) {
                            //getActivity().finish();
                            if(mapView != null) {
                                mapView.removeAllViewsInLayout();

                                if(mapContainer!=null)
                                    mapContainer.removeView(mapView);

                                RelativeLayout parentView = (RelativeLayout) mapView.getParent();
                                //mapView.removeAllViews();
                                ((MapView)view.findViewById(R.id.mapview)).removeAllViews();
                                parentView.removeAllViews();
                                if(parentView!=null)
                                    parentView.recomputeViewAttributes(mapView);
                                getFragmentManager().findFragmentByTag("location").getView().destroyDrawingCache();
                            }

                            getFragmentManager().popBackStack();
                        //  getFragmentManager().popBackStackImmediate();
                        }
                    });
            mapView = (MapView) view.findViewById(R.id.mapview);

            mapView.setBuiltInZoomControls(true);
            mc = mapView.getController();


            Bundle b = this.getArguments();
            if (b != null) {
                latstr = b.getString("LAT");
                lonstr = b.getString("LON");
                name = b.getString("NAME");
                address = b.getString("ADD");
            }

            String coordinates[] = { latstr, lonstr };
            try {
                lat = Double.parseDouble(coordinates[0]);
                lng = Double.parseDouble(coordinates[1]);
            } catch (Exception e) {
                // TODO: handle exception
            }
            p = new GeoPoint((int) (lat * 1E6), (int) (lng * 1E6));
            mc.animateTo(p);
            Drawable icon = getResources().getDrawable(R.drawable.red_pin);
            icon.setBounds(0, 0, icon.getIntrinsicWidth(),
                    icon.getIntrinsicHeight());
            MyItemizedOverlay overlay = new MyItemizedOverlay(icon);
            OverlayItem item = new OverlayItem(p, "", null);
            overlay.addItem(item);
            overlay.populateNow();
            mapView.getOverlays().add(overlay);
            mapView.postInvalidate();
            mc.setZoom(12);
            if (name != null)
                ((TextView) view.findViewById(R.id.event_name)).setText(name);
            if (address != null)
                ((TextView) view.findViewById(R.id.event_date)).setText(address);
            getWheather();

            return mapContainer;
        }

私が得ているエラーは以下です:

10-15 10:43:03.881: E/AndroidRuntime(3778): android.view.InflateException: Binary XML file line #184: Error inflating class <unknown>
10-15 10:43:03.881: E/AndroidRuntime(3778):     at android.view.LayoutInflater.createView(LayoutInflater.java:606)
10-15 10:43:03.881: E/AndroidRuntime(3778):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:680)
10-15 10:43:03.881: E/AndroidRuntime(3778):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:739)
10-15 10:43:03.881: E/AndroidRuntime(3778):     at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
10-15 10:43:03.881: E/AndroidRuntime(3778):     at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
10-15 10:43:03.881: E/AndroidRuntime(3778):     at webspiders.event2mobile.asme.LocationFragment.onCreateView(LocationFragment.java:128)
10-15 10:43:03.881: E/AndroidRuntime(3778):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:828)
10-15 10:43:03.881: E/AndroidRuntime(3778):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1032)
10-15 10:43:03.881: E/AndroidRuntime(3778):     at android.app.BackStackRecord.run(BackStackRecord.java:622)
10-15 10:43:03.881: E/AndroidRuntime(3778):     at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1382)
10-15 10:43:03.881: E/AndroidRuntime(3778):     at android.app.FragmentManagerImpl$1.run(FragmentManager.java:426)
10-15 10:43:03.881: E/AndroidRuntime(3778):     at android.os.Handler.handleCallback(Handler.java:605)
10-15 10:43:03.881: E/AndroidRuntime(3778):     at android.os.Handler.dispatchMessage(Handler.java:92)
10-15 10:43:03.881: E/AndroidRuntime(3778):     at android.os.Looper.loop(Looper.java:137)
10-15 10:43:03.881: E/AndroidRuntime(3778):     at android.app.ActivityThread.main(ActivityThread.java:4507)
10-15 10:43:03.881: E/AndroidRuntime(3778):     at java.lang.reflect.Method.invokeNative(Native Method)
10-15 10:43:03.881: E/AndroidRuntime(3778):     at java.lang.reflect.Method.invoke(Method.java:511)
10-15 10:43:03.881: E/AndroidRuntime(3778):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:978)
10-15 10:43:03.881: E/AndroidRuntime(3778):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:745)
10-15 10:43:03.881: E/AndroidRuntime(3778):     at dalvik.system.NativeStart.main(Native Method)
10-15 10:43:03.881: E/AndroidRuntime(3778): Caused by: java.lang.reflect.InvocationTargetException
10-15 10:43:03.881: E/AndroidRuntime(3778):     at java.lang.reflect.Constructor.constructNative(Native Method)
10-15 10:43:03.881: E/AndroidRuntime(3778):     at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
10-15 10:43:03.881: E/AndroidRuntime(3778):     at android.view.LayoutInflater.createView(LayoutInflater.java:586)
10-15 10:43:03.881: E/AndroidRuntime(3778):     ... 19 more
10-15 10:43:03.881: E/AndroidRuntime(3778): Caused by: java.lang.IllegalStateException: You are only allowed to have a single MapView in a MapActivity
10-15 10:43:03.881: E/AndroidRuntime(3778):     at com.google.android.maps.MapActivity.setupMapView(MapActivity.java:397)
10-15 10:43:03.881: E/AndroidRuntime(3778):     at com.google.android.maps.MapView.<init>(MapView.java:289)
10-15 10:43:03.881: E/AndroidRuntime(3778):     at com.google.android.maps.MapView.<init>(MapView.java:264)
10-15 10:43:03.881: E/AndroidRuntime(3778):     at com.google.android.maps.MapView.<init>(MapView.java:247)
4

2 に答える 2

0

MainActivityに1つのリストビューと1つのマップビューを保持するコンテナがあると思います。

そして、listivewでアイテムが選択されたら、マップ上で何かをしたいと思います。

その場合、マップを保持するフラグメントは1つだけで済み、リストから新しいアイテムが選択されるたびに、新しいデータが利用可能であることをフラグメントに通知する必要があります。フラグメントは自動的に更新されます。

作成方法を知っている場合は、カスタムインターフェイスを介してそれを行うことができます。

于 2012-10-15T11:02:24.930 に答える
0
I resolved the problem like this, by creating map object in Activity class and using it in Fragments. Here the code goes  

In ACTIVITY 

    HomeActivity extends MapActivity {
            View mMapViewContainer;
            MapView mMapView;

        onCreate(){
    ------------
    -------------
          mMapViewContainer = (ViewGroup)LayoutInflater.from(this).inflate(R.layout.location, null);
          mMapView = (MapView) mMapViewContainer.findViewById(R.id.mapview);

    -------------
    ---------------
       }
     @Override
    protected boolean isRouteDisplayed() {

        return false;
    }


    In Fragment:


            HomeActivity parentActivity = (HomeActivity) getActivity();
            if (parentActivity != null) {
                parentActivity.mMapViewContainer.refreshDrawableState();
                mMapViewContainer = parentActivity.mMapViewContainer;
                mMapView = parentActivity.mMapView;

                mMapView.getOverlays().clear();
                mMapView.invalidate();

            }
于 2012-10-18T13:51:05.670 に答える