从另一个类使用Map Fragment

时间:2018-09-03 17:51:57

标签: android fragment

我想使用另一个类MapsActivity的地图片段。

编辑:我会尽力解释得更好,这里的目标是使用从MapActivity类生成的Fragment加载我的位置。但是,我正在使用我的已经有一个Fragment的主类。所以我想我必须将主类上的Fragment与MapActivity片段链接起来。如果您建议使用相同的类来做到这一点,那对我来说还可以,我只是不知道如何使用自定义类而不是我在这里得到的MapActivity类来加载地图片段上的位置。

在我的主班上,我得到了这个,这就是我想要的视图:

private MapFragment mapFragment;

在我的主类.xml中,我得到了:

    <fragment
        android:id="@+id/mapCheckinFazerActivityMapView"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginStart="8dp"
        tools:context=".MapsActivity"
        app:layout_constraintBottom_toBottomOf="@+id/imgCheckinFazerActivityBG"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/txtCheckinFazerActivityTitle"
        app:layout_constraintVertical_bias="0.0" />

现在,我得到了MapsActivity类,这是我进行一些研究之后的基础类...

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.mapCheckinFazerActivityMapView);
        mapFragment.getMapAsync(this);
    }


    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        Log.d("MYTAG", "READY");
        // Add a marker in Sydney and move the camera
        LatLng sydney = new LatLng(-34, 151);
        mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
    }

    public void test(){
        // Add a marker in Sydney and move the camera
        LatLng sydney = new LatLng(-34, 151);
        mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
    }
}

我也得到了MapsActivity .xml

<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:map="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/map"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ViewController.MapsActivity" />

如果我直接使用此类MapsActivity确实可以工作,但是我只想将其用作主要活动中的对象。你能帮我一下吗?预先感谢...

编辑:

也许这张图可以更好地解释。在我的MainActivity上,我得到了这张地图(该怎么做)我想成为MapActivity类的Google地图...因为您可以看到该地图未被识别并且函数OnMapReady没有被调用

enter image description here

1 个答案:

答案 0 :(得分:1)

如果我正确理解了您的意思,您想从MainActivity.java类访问您的 GoogleMap 对象。使用接口

的方法如下:

首先,您可以在 MainActivity.java

中创建类似这样的界面,并添加此代码。
public interface MyMapInterface {
    void onMap(LatLng ltlng);
}

然后,在 MainActivity.java 中将 myMapInterface 声明为

private MyMapInterface myMapInterface ;

MainActivity.java 中要做的另一件事是,在您要访问 GoogleMap 对象的任何地方,都使用调用接口的方法:

myMapInterface.onMap(sydney);

现在,进入您的 MapActivity.java 类,并使您的Activity实现该接口,如下所示:

MapActivity implements MyMapInterface

这样做时,您会在该行下方看到红线,单击Alt + enter,它会提示您添加方法 onMap(Latlng ltlng),通过单击Enter添加该方法键,然后您就可以像这样访问地图:

@Override
    public void onMap(Latlng sydney) {
        mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in 
        Sydney"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
    }

修改

对于给您带来的不便,我们深表歉意。

使您的界面扩展可序列化

public interface MyMapInterface extends Serializable {
    void onMap(LatLng ltlng);
}

然后,像这样在意图 MapActivity.java 中传递接口对象:

intent.putExtra("MyMapInterface", this);
startActivity(intent);

然后输入 MainActivity.java

myMapInterface = getIntent().getSerializableExtra("MyMapInterface");