Java 如何在片段中使用setContentView方法?

Java 如何在片段中使用setContentView方法?,java,android-studio,fragment,Java,Android Studio,Fragment,我正在做一个小项目…项目使用地图,但是setContentView方法有一个问题,当我扩展Fragment而不是FragmentActivity时,它不起作用注意:我需要扩展片段而不是片段活动,因为代码部分显示的代码只是项目的一小部分。在我的原始项目中,如果我将Fragment更改为FragmentActivity,则会在另一个类中出现问题 public class MapsActivity extends Fragment implements OnMapReadyCallback,Locat

我正在做一个小项目…项目使用地图,但是
setContentView
方法有一个问题,当我扩展
Fragment
而不是
FragmentActivity
时,它不起作用注意:我需要扩展
片段
而不是
片段活动
,因为代码部分显示的代码只是项目的一小部分。在我的原始项目中,如果我将
Fragment
更改为
FragmentActivity
,则会在另一个类中出现问题

public class MapsActivity extends Fragment implements OnMapReadyCallback,LocationListener,GoogleMap.OnMarkerClickListener{


    private GoogleMap mMap;
    private DatabaseReference mUsers;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //Dosn't Work with Fragment Extends ?!
        setContentView(R.layout.activity_maps);
        SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
        mUsers= FirebaseDatabase.getInstance().getReference("Users");

    }


    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        googleMap.setOnMarkerClickListener(this);
        mUsers.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                for (DataSnapshot s : dataSnapshot.getChildren()){
                    UserInformation user = s.getValue(UserInformation.class);
                    assert user != null;
                    LatLng location = new LatLng(user.latitude,user.longitude);
                    mMap.addMarker(new MarkerOptions().position(location).title(user.name)).setIcon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW));
                }

            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
            }
        });
    }



    @Override
    public void onLocationChanged(Location location) {
    }
    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }
    @Override
    public void onProviderEnabled(String provider) {
    }
    @Override
    public void onProviderDisabled(String provider) {
    }
    @Override
    public boolean onMarkerClick(Marker marker) {
        return false;
    }
}
我希望应用程序正常运行,并根据firebase中的数据在地图上显示不同的标记,但该应用程序不工作注意:如果我将Fragment更改为FragmentActivity,它将正常工作

我尝试创建视图,但应用程序不工作 “应用程序已停止”

当我将fragment更改为fragment activity时,另一个activity中是否存在此行错误

getSupportFragmentManager().beginTransaction().replace(R.id.container,new HomeFragment()).commit();

当HomeFragment被扩展为extends Fragment时没有错误,但当我将其更改为Fragment Activity时,[new HomeFragment()]中会出现错误。

使用
onCreateView
方法作为片段的起点。您应该将片段视为布局本身,而不是需要表示视图的容器

@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.activity_maps, container, false);
    // ...
    return view;
}

我找到了解决这个问题的办法, 我应该重写两个方法,onViewCreated和onCreateView 然后代码应该放在onCreate中,必须在onViewCreated中,如下所示

public class HomeFragment extends Fragment implements OnMapReadyCallback,LocationListener,GoogleMap.OnMarkerClickListener  {


public GoogleMap mMap;
public DatabaseReference mUsers;

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);
    mUsers= FirebaseDatabase.getInstance().getReference("Users");

}


@NonNull
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_home, container, false);

}

@Override
public void onMapReady(GoogleMap googleMap) {

mMap = googleMap;
        googleMap.setOnMarkerClickListener(this);
        mUsers.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                for (DataSnapshot s : dataSnapshot.getChildren()){
                    UserInformation user = s.getValue(UserInformation.class);
                    assert user != null;
                    LatLng location = new LatLng(user.latitude,user.longitude);
                    mMap.addMarker(new MarkerOptions().position(location).title(user.name)).setIcon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW));
                }

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
            }
        });

}

片段中没有setContentView。你需要使用onCreateView。我试过了,但当我使用这个应用程序时;应用程序停止,不工作?!不能用
片段
替换
活动
。好的,当我扩展片段活动时,另一个活动中出现错误,请查看第三个代码
public class HomeFragment extends Fragment implements OnMapReadyCallback,LocationListener,GoogleMap.OnMarkerClickListener  {


public GoogleMap mMap;
public DatabaseReference mUsers;

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);
    mUsers= FirebaseDatabase.getInstance().getReference("Users");

}


@NonNull
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_home, container, false);

}

@Override
public void onMapReady(GoogleMap googleMap) {

mMap = googleMap;
        googleMap.setOnMarkerClickListener(this);
        mUsers.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                for (DataSnapshot s : dataSnapshot.getChildren()){
                    UserInformation user = s.getValue(UserInformation.class);
                    assert user != null;
                    LatLng location = new LatLng(user.latitude,user.longitude);
                    mMap.addMarker(new MarkerOptions().position(location).title(user.name)).setIcon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW));
                }

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
            }
        });