Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 返回空对象的GoogleMap片段_Java_Android_Google Maps_Android Fragments_Google Play Services - Fatal编程技术网

Java 返回空对象的GoogleMap片段

Java 返回空对象的GoogleMap片段,java,android,google-maps,android-fragments,google-play-services,Java,Android,Google Maps,Android Fragments,Google Play Services,我希望有一个独立于MainActivity的类来初始化map,并有一个静态方法来初始化map,这样它在整个项目中保持不变,任何类都可以使用这个从类返回的googlemap对象,我编写了一个独立的类 public class MapFragment extends AppCompatActivity{ public static SupportMapFragment mapFrag; public static SupportMapFragment GetMapObj() { mapFr

我希望有一个独立于MainActivity的类来初始化map,并有一个静态方法来初始化map,这样它在整个项目中保持不变,任何类都可以使用这个从类返回的googlemap对象,我编写了一个独立的类

public class MapFragment extends AppCompatActivity{

public static SupportMapFragment mapFrag;

public static SupportMapFragment GetMapObj() {
   mapFrag = (SupportMapFragment) new MainActivity().
   getSupportFragmentManager().findFragmentById(R.id.frag_map);
}
在日常活动中,像这样使用它

SupportMapFragment mapFragment = MapFragment.GetMapObj();
        mapFragment.getMapAsync(this);
我有2个xml,1个用于上面的类,1个用于主要活动,我不知道应该将我的

 <fragment
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/frag_map"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    tools:context="com.example.sarahn.clientapimap.MainActivity"
    />

说到这里,我的应用程序在试图调用空对象引用上的getAsncMap的空指针异常上崩溃


}由于
映射片段
未正确初始化,您将获得
NullPointerException

main活动中初始化
SupportMapFragment

main\u activity\u xml
中:

 <fragment
    android:id="@+id/map"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

由于
mapFragment
未正确初始化,您将获得
NullPointerException

main活动中初始化
SupportMapFragment

main\u activity\u xml
中:

 <fragment
    android:id="@+id/map"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

如果您希望您的活动在用户在地图中执行某些操作时执行某些操作,请尝试此操作

public class YourFragment extends Fragment implements OnMapReadyCallback,
    GoogleMap.OnMapClickListener,
    GoogleMap.OnMarkerClickListener{

    private MapFragment mapFragment;
    private GoogleMap mMap;
    private OnMapListener onMapListener;

    public static YourFragment newInstance(){
        return new YourFragment();
    }

    @Override public void onAttach(Context context) {
        super.onAttach(context);
        try {
            this.onMapListener = (OnMapListener)context;
        }
        catch (final ClassCastException e) {
            throw new ClassCastException(context.toString() + " must implement OnMapListener");
        }
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.your_layout, container, false);

        mapFragment = (MapFragment)getFragmentManager().findFragmentById(R.id. frag_map); 
        mapFragment.getMapAsync(this); //Its async, It could last a little bit and 
        //that is the reason why you are getting NULL,
        // to work Asynchronously you should implement the Callback 'OnMapReadyCallback'.

        return rootView;
    }

    @Override public void onMapReady(GoogleMap googleMap) { 
        mMap = googleMap; 
        mMap.setOnMapClickListener(this);
        mMap.setOnMarkerClickListener(this);
    }

    @Override public void onMapClick(LatLng latLng) {
        onMapListener.onMapClick(latLng);
    }

    @Override public boolean onMarkerClick(Marker marker) {
        onMapListener.onMarkerClick(marker);
    }

    public interface OnMapListener{
        void onMapClick(LatLng latLng);
        void onMarkerClick(Marker marker);
    }
}


public class YourActivity extends AppCompatActivity implements OnMapListener {

    @Override protected void onCreate(Bundle savedInstanceState) {

        ...
        YourFragment newFragment = YourFragment.newInstance();
        ...
    }

    public void onMapClick(LatLng latLng){
    //do something on your activity
    }
    public void onMarkerClick(Marker marker){
    //do something on your activity
    }          
}

如果您希望您的活动在用户在地图中执行某些操作时执行某些操作,请尝试此操作

public class YourFragment extends Fragment implements OnMapReadyCallback,
    GoogleMap.OnMapClickListener,
    GoogleMap.OnMarkerClickListener{

    private MapFragment mapFragment;
    private GoogleMap mMap;
    private OnMapListener onMapListener;

    public static YourFragment newInstance(){
        return new YourFragment();
    }

    @Override public void onAttach(Context context) {
        super.onAttach(context);
        try {
            this.onMapListener = (OnMapListener)context;
        }
        catch (final ClassCastException e) {
            throw new ClassCastException(context.toString() + " must implement OnMapListener");
        }
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.your_layout, container, false);

        mapFragment = (MapFragment)getFragmentManager().findFragmentById(R.id. frag_map); 
        mapFragment.getMapAsync(this); //Its async, It could last a little bit and 
        //that is the reason why you are getting NULL,
        // to work Asynchronously you should implement the Callback 'OnMapReadyCallback'.

        return rootView;
    }

    @Override public void onMapReady(GoogleMap googleMap) { 
        mMap = googleMap; 
        mMap.setOnMapClickListener(this);
        mMap.setOnMarkerClickListener(this);
    }

    @Override public void onMapClick(LatLng latLng) {
        onMapListener.onMapClick(latLng);
    }

    @Override public boolean onMarkerClick(Marker marker) {
        onMapListener.onMarkerClick(marker);
    }

    public interface OnMapListener{
        void onMapClick(LatLng latLng);
        void onMarkerClick(Marker marker);
    }
}


public class YourActivity extends AppCompatActivity implements OnMapListener {

    @Override protected void onCreate(Bundle savedInstanceState) {

        ...
        YourFragment newFragment = YourFragment.newInstance();
        ...
    }

    public void onMapClick(LatLng latLng){
    //do something on your activity
    }
    public void onMarkerClick(Marker marker){
    //do something on your activity
    }          
}

您可以扩展
SupportMapFragment
,并在片段自己的
onCreate
方法中初始化映射。这避免了在逻辑上属于片段的代码使您的活动变得混乱

public class MyMapFragment extends SupportMapFragment {
    @Override
    public void onCreate(final Bundle bundle) {
        super.onCreate(bundle);
        getMapAsync(new OnMapReadyCallback() {
            @Override
            public void onMapReady(final GoogleMap map) {
                // configure the map here
            }
        });
    }
}
然后将其放在活动XML中,就像放在普通的
SupportMapFragment
中一样

<fragment
    android:id="@+id/map"
    android:name="com.myapp.MyMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>


如果仍然需要访问活动中的片段,可以调用
getSupportFragmentManager().findframentbyid(R.id.map)
。但是由于片段配置了映射,活动可能不再需要访问它。使用片段的活动通常只需调用
onCreate
调用
setContentView

就可以扩展
SupportMapFragment
并在片段自己的
onCreate
方法中初始化映射。这避免了在逻辑上属于片段的代码使您的活动变得混乱

public class MyMapFragment extends SupportMapFragment {
    @Override
    public void onCreate(final Bundle bundle) {
        super.onCreate(bundle);
        getMapAsync(new OnMapReadyCallback() {
            @Override
            public void onMapReady(final GoogleMap map) {
                // configure the map here
            }
        });
    }
}
然后将其放在活动XML中,就像放在普通的
SupportMapFragment
中一样

<fragment
    android:id="@+id/map"
    android:name="com.myapp.MyMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>


如果仍然需要访问活动中的片段,可以调用
getSupportFragmentManager().findframentbyid(R.id.map)
。但是由于片段配置了映射,活动可能不再需要访问它。使用片段的活动通常只不过是
onCreate
调用
setContentView

问题在于您试图创建一个新的上下文,而不是让操作系统来创建。必须在现有上下文上使用
startActivity
,才能创建新活动

关于如何获取地图对象,以下是一个示例:

public class MapFragment extends AppCompatActivity{

    public static SupportMapFragment mapFrag;

    public static SupportMapFragment GetMapObj(FragmentActivity activity) {
       mapFrag = (SupportMapFragment) activity.
         getSupportFragmentManager().findFragmentById(R.id.frag_map);
    }
}
在您的活动中,只需称之为:

SupportMapFragment mapFragment = MapFragment.GetMapObj(this);
        mapFragment.getMapAsync(this);

问题在于,您正试图创建一个新的上下文,而不是让操作系统来创建。必须在现有上下文上使用
startActivity
,才能创建新活动

关于如何获取地图对象,以下是一个示例:

public class MapFragment extends AppCompatActivity{

    public static SupportMapFragment mapFrag;

    public static SupportMapFragment GetMapObj(FragmentActivity activity) {
       mapFrag = (SupportMapFragment) activity.
         getSupportFragmentManager().findFragmentById(R.id.frag_map);
    }
}
在您的活动中,只需称之为:

SupportMapFragment mapFragment = MapFragment.GetMapObj(this);
        mapFragment.getMapAsync(this);


但正如我之前所说的,我想在另一个类中而不是在MainActivity中实现这些功能,我只想在MainActivity中的返回对象上调用getMapAsync。请看:map的静态对象不是一个好的实践为什么我不能这样做,我首先要做的是
MapFragment.GetMapObj()
。将永远不会返回有效对象..导致布局尚未膨胀..请参见:但正如我之前所述,我希望将这些内容放在另一个类中,而不是在MainActivity中,我只想在MainActivity中的返回对象上调用getMapAsync请参见:map的静态对象不是一个好的实践为什么我不能这样做,我首先要做的是
MapFragment.GetMapObj()
。将永远不会返回有效的对象..因为布局尚未膨胀..请参见:我实现了类似的功能,但正如我前面所述,我希望将这些功能放在另一个类中,而不是MainActivity中,我只想在MainActivity中对返回的对象调用getMapAsync我认为应该重用GoogleMap的对象,而不是SupportMapFragment的对象,但我有一个问题,你想在几个活动中还是只在一个活动中重用该对象?我只想有干净的代码,这样我的MainActivity就可以排除所有这些,并利用其他classI的初始化更新我的答案dude,告诉我你是否想要这样的东西。我已经实现了,但正如我之前所说的,我希望将这些东西放在另一个类中,而不是MainActivity中,我只想在MainActivity中的返回对象上调用getMapAsync我认为应该重用GoogleMap的对象,而不是SupportMapFragment的对象,但我有一个问题,你想在几个活动中还是只在一个活动中重用该对象?我只想有干净的代码,这样我的MainActivity就可以排除所有这些,并利用初始化来更新其他classI我的答案dude,告诉我你是否想要这样的东西。你考虑过使用onSaveInstanceState函数来存储映射状态吗?我想要干净的代码,我的MainActivity应该排除所有这些东西。我只想在MainActivity中有一个对象,并在它上调用getAsync。永远不要使用
new
创建活动实例。它将是未初始化的和无用的。@KevinKrumwiede您能解释一下您的观点吗?当Android框架创建一个活动时,它会向其中注入一个
上下文
,并调用其初始化生命周期方法。如果没有所有的初始化,像
getSupportFragmentManager
这样的方法根本无法工作。您是否考虑过使用onSaveInstanceState函数来存储映射状态状态?我想要干净的代码,我的MainActivity应该排除所有这些内容我只想在MainActivity a中包含对象