双Android地图/ Google商家信息详情屏幕

时间:2016-04-15 01:19:26

标签: java android google-maps android-fragments google-places-api

我有片段的真正麻烦!我有一个结果活动类,运行两个片段,下半部分地图与位置和近谷地方标记,上半部分(或我也想要它,但它不会红润工作)保持地址和细节也是用户选择标记。我得到了一切,我可以选择标记!我可以加载我的位置,我可以得到最近的地方,我甚至可以将地方细节运行到另一个片段(但它加载屏幕)。但你认为我可以将细节加载到屏幕的上半部分!! (不!)我需要帮助,我几乎一直在摸不着头...... 20到2,我不能面对另一天......我知道它的东西很小(总是在我问的时候在堆栈上)但我不能发现它。你能帮帮我吗! 包含fragment,map_fragment,left search_frag for dynamic

的xml代码
 <RelativeLayout
    android:id="@+id/search_frag"
    android:layout_width="match_parent"
    android:layout_height="@dimen/results"
    android:background="@color/cream"
    android:layout_below="@+id/top_banner"
    android:orientation="horizontal"
    tools:layout="@layout/result_hint">
    </RelativeLayout>
<fragment
    android:layout_below="@id/search_frag"
    android:id="@+id/map_fragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/cream"
    android:orientation="horizontal"
    android:name="boo.thefoodhunt.fragment.MapFragment"
    tools:layout="@layout/template_map_view"/>

ResultsActivitiy.java:我在那里放了一个虚拟片段以查看它是否会加载它确实如此,认为用新片段替换它可能更容易(不是)

public class ResultsActivity extends FragmentActivity
        implements MapFragment.MarkerClickCB {
    //Log
    private final String TAG = this.getClass().getName();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_results);
    //Master data list Fragment

        FragmentManager fm = getSupportFragmentManager();

        SelectFrag firstFragment = new SelectFrag();

        FragmentTransaction ft = fm.beginTransaction();

        ft.add(R.id.search_frag, firstFragment);
        ft.commit();
}

MapFragment.java 公共布尔值onMarkerClick(标记标记)上的else if语句的一部分。未注释的代码可以工作并传达用户选择的地址详细信息,并将详细信息发送到全屏片段。

 if (marker.equals(this.myLocMarker) && nearby != null) {
            for (Marker placeMarker : nearby.keySet()) {
                placeMarker.setVisible(!placeMarker.isVisible());
            }
        } else if (nearby != null && nearby.containsKey(googLocation)) {
            Intent intent = new Intent(getActivity(), TempPlaceActivity.class);
            intent.putExtra("PLACE", nearby.get(googLocation));
            startActivity(intent);
            //   mCallbacks.onMarkerSelected("PLACE", nearby);
            return true;

代码有点吵了我很抱歉我不想发布它,因为有大约5种不同的java.classes ...只是在正确的方向上的一点将是太棒了。 ResultsActivity.java包含2个片段并具有results.xml。 MapFragment.java保存地图,谷歌地方详细信息位于frame.xml中。 PlacesDetailsFragments保存详细信息并保存在places.xml文件中。每个片段都有活动,它们似乎都是一对的......我今晚放弃任何帮助都将受到赞赏!

1 个答案:

答案 0 :(得分:0)

我把它解决了,并认为id分享。好的,片段是用xml布局编写的,就像这样......

<RelativeLayout
    android:id="@+id/search_frag"
    android:layout_width="match_parent"
    android:layout_height="@dimen/results"
    android:layout_below="@+id/top_banner"
    android:background="@color/cream"
    android:orientation="horizontal"
    tools:layout="@layout/result_hint"></RelativeLayout>

<RelativeLayout
    android:id="@+id/map_fragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@id/search_frag"
    android:background="@color/cream"
    android:orientation="horizontal"
    tools:layout="@layout/template_map_view" />

search_frag和map_fragment需要为RelativeLayout,因为它将在您希望它们出现的活动中编程

ACTIVITY CLASS search_frag

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_results);
        setUpMapIfNeeded();

        ....
        //sets up default fragment, will later be replaced with fragment when marker is selected
        if (findViewById(R.id.fragment_container) == null) {

            if (savedInstanceState != null) {
                return;
            }

            FragmentManager fm = getSupportFragmentManager();
            SelectFrag firstFragment = new SelectFrag();
            FragmentTransaction ft = fm.beginTransaction();
                ft.add(R.id.search_frag, firstFragment);
                ft.commit();
            }
...

<强> map_frag

private void setUpMapIfNeeded() {
        if (mMap != null) {
            return;
        }
       mMap = new MapFragment();
        mMap.setArguments(getIntent().getExtras());
        getSupportFragmentManager().beginTransaction()
                .add(R.id.map_fragment, mMap).commit();
    }

MAP FRAGMENT

  MarkerClickCB mCallbacks; //communicates with the activity
   //interface set up
     public interface MarkerClickCB {
            void onMarkerSelected(String place, GoogePlaces place1);
        }

    ....

 mMap.setOnMarkerClickListener(new OnMarkerClickListener() {

        @Override
        public boolean onMarkerClick(Marker marker) {

            if (!mClusterManager.onMarkerClick(marker)) {
                googLocation = marker;
                cluster.getPosition();
                if (googLocation.equals(userLocMarker) && clusts2 == null) {
                    searchFilter();
                }
                if (marker.equals(userLocMarker) && nearby != null) {
                    for (Marker placeMarker : nearby.keySet()) {
                        placeMarker.setVisible(!placeMarker.isVisible());
                    }
                } else if (cluster != null) {

                    mCallbacks.onMarkerSelected("PLACE", clickedClusterItem.getPlace());
                    getDistance(clickedClusterItem.getPosition().latitude, clickedClusterItem.getPosition().longitude);

                    return true;
                }
            }
            return false;
        }
    });

..现在回到包含以前编程的片段的活动类。我们需要将search_frag替换为包含所选标记的Google地方信息的新片段。

活动类需要为地图片段

中的数据通信实现回调数据

返回活动类

public  class ResultsActivity extends AppCompatActivity
        implements MapFragment.MarkerClickCB
....
   //previous fragment info//  
...
     public void onMarkerSelected(String near, GoogePlaces googPlace) {

            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
            PlaceFragment fragment = PlaceFragment.newInstance(googPlace);
            ft.replace(R.id.search_frag, fragment);
            ft.commit();
        }

..保存数据的替换片段 PLACE FRAGMENT

    final static String PLACES_ID = "GoogePlaces";

    //Creates fragment object with details

    public static PlaceFragment newInstance(GoogePlaces place) {
            PlaceFragment fragment = new PlaceFragment();
            Bundle bundle = new Bundle();
            bundle.putSerializable(PLACES_ID, place);
            fragment.setArguments(bundle);

            return fragment;
        }

//this bit got a bit messy for me - welcome to comment with improvements 

   public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        place = (GoogePlaces) getArguments().getSerializable(PLACES_ID);



 View view = inflater.inflate(R.layout.activity_place_detail, container, false);

    this.context = getActivity().getApplicationContext();

    Log.i("PLACE EXAMPLE", "Place Detail Activity");


        place = (GoogePlaces) getArguments().getSerializable(PLACES_ID);
...

        getActivity().setTitle(place.getName());
        String placesKey = getResources().getString(R.string.places_key);

//connect to google places - to gather eatery details
        String placesRequest = "https://maps.googleapis.com/maps/api/place/details/json?" +
                "key=" + placesKey + "&reference=" + place.getReference();
        PlacesDetailReadFeed detailTask = new PlacesDetailReadFeed();
        detailTask.execute(new String[]{placesRequest});

       ......

    return view;
    }

好吧,作为一个新手(ish)程序员,这对我来说非常困难,我必须承认,任何指针,对代码清理的批评都将受到赞赏