首页 > 解决方案 > Android:如何将 Google 地图添加到 ViewPager?

问题描述

我想制作一个在主屏幕上具有 ViewPager 的应用程序,其中包含地图和个人资料部分。因此,对于 ViewPager 中的 position = 0,存在地图,对于 position = 1,存在配置文件。

对于主屏幕上的这两个“部分”中的每一个,我都有两个活动:带有 MapActivity.java 的 map.xml 和带有 Profile.java 的 profile.xml。这两个都在 EnumFrag java 类中被夸大,具体取决于位置(你会看到 if )。

我有两个问题:

  1. 第一个是当我尝试向左或向右滑动时,地图会移动,而不是 ViewPager 移动到下一张幻灯片。我试图在边缘放置一个形状,但它不像滑动手势穿过形状那样工作。请问这里有什么帮助吗?
  2. 第二个与第一个有关, 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
    }
}

标签: javaandroidgoogle-mapsandroid-viewpager

解决方案


为什么不将 MapActivity 添加到 MainScreen Activity 中。您甚至不在 PagerAdapter 类中使用 MapActivity。在此之后,我将在 PagerAdapter 的构造函数中创建另一个属性:

private MapActivity current;


public EnumFragments(MapActivity map_activity)
{
this.current = map_activity;
}

然后我会在 map_activity 中放置一个 getter 方法,它会返回一个视图,您可以在其中看到当前的 GoogleMap 或其他功能。

您的问题是您没有使用新的 MapActivity ...

我希望这可以帮助你


推荐阅读