【问题标题】:How can i use setContentView method in fragment?如何在片段中使用 setContentView 方法?
【发布时间】:2019-07-20 21:09:44
【问题描述】:

我正在做一个小项目...项目适用于地图,但是setContentView 方法存在问题,当我扩展Fragment 而不是FragmentActivity 时它不起作用。 注意:我需要扩展Fragment 而不是Fragment Activity,因为代码部分显示的代码只是项目的一小部分。在我的原始项目中,如果我将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 它可以正常工作..

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

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


private GoogleMap mMap;
private DatabaseReference mUsers;

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


@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.activity_maps, container, false);
    SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);
    mUsers= FirebaseDatabase.getInstance().getReference("Users");
    return view;
}

@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;
}

当我将片段更改为片段活动时,出现错误是另一活动中的这一行

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

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

【问题讨论】:

  • Fragment 中没有 setContentView。您需要使用 onCreateView。
  • 我试过了,但是当我吃午饭的时候;应用已停止,无法正常工作?!
  • 不能用Fragment 替换Activity
  • 好的,当我扩展 Fragment Activity 时,另一个 Activity 中出现错误,请查看第三个代码

标签: java android-studio fragment


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我找到了解决这个问题的方法, 我应该重写 2 个方法, 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) {
                }
            });
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-30
      • 1970-01-01
      • 2013-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多