如何制作app包含类似微信的可切换型页面

img


我想到了三个方法:
1.用viewpager加上4个fragment。感觉不太合理
2.用viewpager包含4个actvity。试了下,页面无法显示,可能有什么错误
3.用模块化编程。这块还不回。
望各位给点建议

地图fragment:
package com.example.myapplication;

import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;

import com.baidu.location.BDAbstractLocationListener;
import com.baidu.location.BDLocation;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapPoi;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener;
import com.baidu.mapapi.search.poi.PoiDetailResult;
import com.baidu.mapapi.search.poi.PoiDetailSearchResult;
import com.baidu.mapapi.search.poi.PoiIndoorResult;
import com.baidu.mapapi.search.poi.PoiResult;
import com.baidu.mapapi.search.poi.PoiSearch;

import java.util.ArrayList;
import java.util.List;

public class MapFragment extends Fragment {
    private MapView mMapView = null;
    BaiduMap mBaiduMap = null;
    LocationClient mLocationClient = null;
    private boolean isFirstLocation = true;
    private BitmapDescriptor bitmap;
    private double mCurrentLat = 0.0;
    private double mCurrentLon = 0.0;
    private TextView markerText;
    private TextView positionText;
    private
    Button normal;
    Button Satellite;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_map, container, false);
    }
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //获取地图控件引用

        positionText = getView().findViewById(R.id.mlocation);
        markerText = getView().findViewById(R.id.markerloc);
        mMapView = getView().findViewById(R.id.baiduMapView);
        //获取到地图
        mBaiduMap = mMapView.getMap();
        mBaiduMap.setTrafficEnabled(true);
        getPermissionMethod();
        LatLng point1 = new LatLng(39.963175, 116.400244);
        BitmapDescriptor wrj = BitmapDescriptorFactory.fromResource(R.drawable.marker);
        OverlayOptions options = new MarkerOptions().position(point1).icon(wrj);
        mBaiduMap.addOverlay(options);
        PoiSearch mPoiSearch = PoiSearch.newInstance();
        OnGetPoiSearchResultListener listener = new OnGetPoiSearchResultListener() {
            @Override
            public void onGetPoiResult(PoiResult poiResult) {

            }

            @Override
            public void onGetPoiDetailResult(PoiDetailSearchResult poiDetailSearchResult) {

            }

            @Override
            public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {

            }

            @Override
            public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {

            }
        };
        normal = getView().findViewById(R.id.normal);
        Satellite = getView().findViewById(R.id.satellite);
        normal.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mMapView = (MapView)getView(). findViewById(R.id.baiduMapView);
                mBaiduMap = mMapView.getMap();
//普通地图 ,mBaiduMap是地图控制器对象
                mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
                mBaiduMap.setTrafficEnabled(true);
            }
        });
        Satellite.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mMapView = (MapView)getView(). findViewById(R.id.baiduMapView);
                mBaiduMap = mMapView.getMap();
//卫星地图
                mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
            }
        });
        bitmap = BitmapDescriptorFactory
                .fromResource(R.drawable.marker);
        mBaiduMap.setOnMapClickListener(new BaiduMap.OnMapClickListener() {
            @Override
            public void onMapPoiClick(MapPoi arg0) {
                // TODO Auto-generated method stub
            }

            // 此方法就是点击地图监听
            @Override
            public void onMapClick(LatLng latLng) {
                StringBuilder markerPosition = new StringBuilder();

                // 获取经纬度
                mCurrentLat = latLng.latitude;
                mCurrentLon = latLng.longitude;

                // 先清除图层
                mBaiduMap.clear();
                // 定义Maker坐标点
                LatLng point1 = new LatLng(39.963175, 116.400244);
                BitmapDescriptor wrj = BitmapDescriptorFactory.fromResource(R.drawable.marker);
                OverlayOptions options1 = new MarkerOptions().position(point1).icon(wrj);
                mBaiduMap.addOverlay(options1);
                LatLng point = new LatLng(mCurrentLat, mCurrentLon);
                // 构建MarkerOption,用于在地图上添加Marker
                MarkerOptions options = new MarkerOptions().position(point)
                        .icon(bitmap);
                // 在地图上添加Marker,并显示
                mBaiduMap.addOverlay(options);


                markerPosition.append(mCurrentLat).append("\n");
                markerPosition.append(mCurrentLon).append("\n");
                markerText.setText(markerPosition);


            }
        });
    }
    //设置地图放大的倍数


    @Override
    public void onResume() {
        mMapView.onResume();
        super.onResume();
    }

    @Override
    public void onPause() {
        mMapView.onPause();
        super.onPause();
    }

    @Override
    public void onDestroy() {
        mLocationClient.stop();
        mBaiduMap.setMyLocationEnabled(false);
        mMapView.onDestroy();
        mMapView = null;
        super.onDestroy();
    }


    public class MyLocationListener extends BDAbstractLocationListener {
        @Override
        public void onReceiveLocation(BDLocation location) {
            StringBuilder Position = new StringBuilder();
            Position.append(location.getLatitude()).append("\n");
            Position.append(location.getLongitude()).append("\n");
            Position.append(location.getAddress()).append("\n");
            Position.append(location.getCity()).append("\n");
            positionText.setText(Position);
            if (location == null || mMapView == null) {
                return;
            }
            LatLng mylocation = new LatLng(location.getLatitude(), location.getLongitude());
            MyLocationData locData = new MyLocationData.Builder()
                    .accuracy(location.getRadius())
                    .direction(location.getDirection()).latitude(location.getLatitude())
                    .longitude(location.getLongitude()).build();
            mBaiduMap.setMyLocationData(locData);
            if (isFirstLocation) {
                isFirstLocation = false;
                setPosition2Center(mBaiduMap, location, true);
            }
            Button button = (Button)getView(). findViewById(R.id.dw_bt);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
// TODO Auto-generated method stub
                    mBaiduMap.setMyLocationEnabled(true);
                    setPosition2Center(mBaiduMap, location, true);
                }
            });
        }
        //回调方法,mLocationClient.start的 回调方法,


    }

    public void setPosition2Center(BaiduMap map, BDLocation bdLocation, Boolean isShowLoc) {
        MyLocationData locData = new MyLocationData.Builder()
                .accuracy(bdLocation.getRadius())
                .direction(bdLocation.getRadius()).latitude(bdLocation.getLatitude())
                .longitude(bdLocation.getLongitude()).build();
        map.setMyLocationData(locData);
        if (isShowLoc) {
            LatLng ll = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude());
            MapStatus.Builder builder = new MapStatus.Builder();
            builder.target(ll).zoom(18.0f);
            map.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
        }
    }


    public void init_location() {
        mBaiduMap.setMyLocationEnabled(true);
        mLocationClient = new LocationClient(MapFragment.this.getActivity());
//通过LocationClientOption设置LocationClient相关参数
        LocationClientOption option = new LocationClientOption();

        option.setOpenGps(true); // 打开gps

        option.setCoorType("bd09ll"); // 设置坐标类型
        option.setScanSpan(1000);
        option.setIsNeedAddress(true);
//设置locationClientOption
        mLocationClient.setLocOption(option);
//注册LocationListener监听器
        MyLocationListener myLocationListener = new MyLocationListener();
        mLocationClient.registerLocationListener(myLocationListener);
//开启地图定位图层

        mLocationClient.start();


    }

    private void getPermissionMethod() {
        List<String> permissionList = new ArrayList<>();

        if (ContextCompat.checkSelfPermission(MapFragment.this.getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
        }

        if (!permissionList.isEmpty()) { //权限列表不是空
            String[] permissions = permissionList.toArray(new String[permissionList.size()]);
            ActivityCompat.requestPermissions(MapFragment.this.getActivity(), permissions, 1);
        } else {
            requestLocation();
        }
    }

    private void requestLocation() {
        init_location();//其他请求设置
        mLocationClient.start();  //定位请求开启
    }


    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case 1:
                if (grantResults.length > 0) {
                    for (int result : grantResults) {
                        if (result != PackageManager.PERMISSION_GRANTED) {
                            Toast.makeText(MapFragment.this.getActivity(), "必须统一所有权限才能使用本程序", Toast.LENGTH_SHORT).show();

                            return;
                        }
                    }
                    requestLocation();
                } else {
                    Toast.makeText(MapFragment.this.getActivity(), "发生未知错误", Toast.LENGTH_SHORT).show();
                }
                break;
            default:
        }
    }
}
mainactivity:
package com.example.myapplication;


import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.ViewPager;
import androidx.viewpager2.widget.ViewPager2;

import android.os.Bundle;
import android.text.Layout;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private ViewPager viewpager;
    private LinearLayout llmap;
    private LinearLayout llfaction;
    private LinearLayout lluser;
    private LinearLayout llfind;
    private ImageView ivmap;
    private ImageView ivfaction;
    private ImageView ivuser;
    private ImageView ivfind;
    private ImageView ivcurrent;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        LayoutInflater Lf=getLayoutInflater().from(this);
        View view1=Lf.inflate(R.layout.fragment_map,null);
        View view2=Lf.inflate(R.layout.activity_function,null);
        View view3=Lf.inflate(R.layout.activity_find,null);
        View view4=Lf.inflate(R.layout.activity_user,null);
        viewpager=findViewById(R.id.viewpage);
        List<View> viewList=new ArrayList<>();
        viewList.add(view1);
        viewList.add(view2);
        viewList.add(view3);
        viewList.add(view4);
        MyAdapter adapter=new MyAdapter(viewList);
        viewpager.setAdapter(adapter);
        initTableView();

    }
    private void initTableView() {
        llmap=findViewById(R.id.tab_map);
        llmap.setOnClickListener(this);
        llfaction=findViewById(R.id.tab_faction);
        llfaction.setOnClickListener(this);
        llfind=findViewById(R.id.tab_find);
        llfind.setOnClickListener(this);
        lluser=findViewById(R.id.tab_user);
        lluser.setOnClickListener(this);
        ivmap=findViewById(R.id.tb_iv_map);
        ivfaction=findViewById(R.id.tb_iv_faction);
        ivfind=findViewById(R.id.tb_iv_find);
        ivuser=findViewById(R.id.tb_iv_user);
        ivmap.setSelected(true);
        ivcurrent=ivmap;

    }
    private void changeTab(int position) {
        ivcurrent.setSelected(false);
        ViewPager viewpager=findViewById(R.id.viewpage);
        switch (position)
        {

            case R.id.tab_map:viewpager.setCurrentItem(0);
            case 0:ivmap.setSelected(true);ivcurrent=ivmap;break;
            case R.id.tab_faction:viewpager.setCurrentItem(1);
            case 1:ivfaction.setSelected(true);ivcurrent=ivfaction;break;
            case R.id.tab_find:viewpager.setCurrentItem(2);
            case 2:ivfind.setSelected(true);ivcurrent=ivfind;break;
            case R.id.tab_user:viewpager.setCurrentItem(3);
            case 3:ivuser.setSelected(true);ivcurrent=ivuser;break;
        }
    }
    @Override
    public void onClick(View view) {
        changeTab(view.getId());
    }

用viewpager加上4个fragment,这个方案可行,百度一下这个是怎么实现的吧