【问题标题】:Android: How can I add Google map to a ViewPager?Android:如何将 Google 地图添加到 ViewPager?
【发布时间】:2020-04-14 21:48:34
【问题描述】:

我想制作一个在主屏幕上具有 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();
            }
        }
    }
}

Profile.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());

    }
}

EnumFragment.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;
    }
}

MainScreen.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
    }
}

【问题讨论】:

    标签: java android google-maps android-viewpager


    【解决方案1】:

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

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

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

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

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      • 2016-11-24
      • 1970-01-01
      • 2014-06-25
      • 2020-07-27
      • 1970-01-01
      相关资源
      最近更新 更多