java - Android:如何将 Google 地图添加到 ViewPager?
问题描述
我想制作一个在主屏幕上具有 ViewPager 的应用程序,其中包含地图和个人资料部分。因此,对于 ViewPager 中的 position = 0,存在地图,对于 position = 1,存在配置文件。
对于主屏幕上的这两个“部分”中的每一个,我都有两个活动:带有 MapActivity.java 的 map.xml 和带有 Profile.java 的 profile.xml。这两个都在 EnumFrag java 类中被夸大,具体取决于位置(你会看到 if )。
我有两个问题:
- 第一个是当我尝试向左或向右滑动时,地图会移动,而不是 ViewPager 移动到下一张幻灯片。我试图在边缘放置一个形状,但它不像滑动手势穿过形状那样工作。请问这里有什么帮助吗?
- 第二个与第一个有关, MapActivity.java 类甚至没有运行,因为 onCreate 没有运行(我放了一个 Toast 在那里显示一些东西,但什么也没发生)。请问有什么帮助吗?(我创建了地图类对象)。
map.xml 包含一个简单的片段,其 id 为 map。
MapActivity.java:
public class MapActivity extends FragmentActivity implements OnMapReadyCallback {
private GoogleMap map;
private Location me;
private FusedLocationProviderClient fusedLocationProviderClient;
private static final int REQUEST_CODE = 101;
@Override
protected void onCreate(Bundle savedInstanceState) {
Toast.makeText(this, "hey din onCreate", Toast.LENGTH_SHORT).show();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
getLastLocation();
}
private void getLastLocation() {
if(ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},REQUEST_CODE);
return;
}
Toast.makeText(getApplicationContext(), "hey...", Toast.LENGTH_SHORT).show();
Task<Location> task = fusedLocationProviderClient.getLastLocation();
task.addOnSuccessListener(new OnSuccessListener<Location>() {
@Override
public void onSuccess(Location location) {
if(location != null){
me = location;
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(MapActivity.this);
}
else
Toast.makeText(getApplicationContext(), "Deschide-ti locatia", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onMapReady(GoogleMap googleMap) {
map = googleMap;
MapStyleOptions mapStyleOptions= MapStyleOptions.loadRawResourceStyle(this,R.raw.map_style);
googleMap.setMapStyle(mapStyleOptions);
LatLng point = new LatLng(me.getLatitude(),me.getLongitude());
MarkerOptions markerOptions = new MarkerOptions().position(point).title("Me");
googleMap.animateCamera(CameraUpdateFactory.newLatLng(point));
googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(point,16));
googleMap.addMarker(markerOptions);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == REQUEST_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
getLastLocation();
}
}
}
}
配置文件.java
public class Profile extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_profile);
EditText username = findViewById(R.id.usernameProfile);
username.setText(MainScreen.getUsername());
}
}
枚举片段.java
public class EnumFragments extends PagerAdapter {
private Context context;
public EnumFragments(Context context) {
this.context = context;
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view;
MapActivity mapActivity = new MapActivity();
switch (position){
case 0:
view = layoutInflater.inflate(R.layout.activity_profile,null);
break;
default:
view = layoutInflater.inflate(R.layout.activity_map,null);
break;
}
ViewPager viewPager = (ViewPager)container;
viewPager.addView(view);
return view;
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
ViewPager viewPager = (ViewPager)container;
View view = (View) object;
viewPager.removeView(view);
}
@Override
public int getCount() {
return 2;
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return view == object;
}
}
主屏幕.java
public class MainScreen extends AppCompatActivity {
private static String username;
private ViewPager viewPager;
private EnumFragments enumFragments;
private static int userID;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_screen);
Bundle extras = getIntent().getExtras();
userID = extras.getInt("userID");
username = extras.getString("username");
viewPager = findViewById(R.id.mainSlider);
EnumFragments enumFragments = new EnumFragments(this);
viewPager.setAdapter(enumFragments);
}
public static int getUserID() {
return userID;
}
public static String getUsername() {
return username;
}
@Override
public void onBackPressed() {
//Nothing
}
}
解决方案
为什么不将 MapActivity 添加到 MainScreen Activity 中。您甚至不在 PagerAdapter 类中使用 MapActivity。在此之后,我将在 PagerAdapter 的构造函数中创建另一个属性:
private MapActivity current;
public EnumFragments(MapActivity map_activity)
{
this.current = map_activity;
}
然后我会在 map_activity 中放置一个 getter 方法,它会返回一个视图,您可以在其中看到当前的 GoogleMap 或其他功能。
您的问题是您没有使用新的 MapActivity ...
我希望这可以帮助你
推荐阅读
- r - 通过列选择将数据帧拆分为多个数据帧
- c++ - 为什么这个合并排序实现不能正常工作?
- r - 选择嵌套列表的一个元素并将其转换为 R 中的数据框
- r - 需要用固定均值 25 和 st 2 替换年龄中的 NA
- reactjs - lit-element 和 React 的主要区别
- javascript - 无法加载通过 React App 中的父组件作为道具传递给子组件的图像
- mysql - 如何在 SQL 上创建显示订单行的新列
- javascript - 当我使用 async-await 和 useEffect 时,我应该如何存储获取的数据?
- javascript - 获取 X 金额后停止请求
- angular - 尝试在角度中使用地图运算符转换对象(类型转换)