Java 返回空对象的GoogleMap片段
我希望有一个独立于MainActivity的类来初始化map,并有一个静态方法来初始化map,这样它在整个项目中保持不变,任何类都可以使用这个从类返回的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
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中包含对象