1. 程式人生 > 實用技巧 >解決問題 java.lang.RuntimeException: Unable to instantiate activity ComponentInfo

解決問題 java.lang.RuntimeException: Unable to instantiate activity ComponentInfo

問題:

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.express_delivery/com.example.express_delivery.MainActivity}: java.lang.InstantiationException: java.lang.Class<com.example.express_delivery.MainActivity> has no zero argument constructor

並且軟體進入後直接閃屏退出

其錯誤圖:

解決:

我上網搜了很多,他們的問題大都和我的不一樣

參考部落格:

https://blog.csdn.net/dukongjian/article/details/87385491

https://www.cnblogs.com/z1141000271/p/7905912.html

https://blog.csdn.net/disanxiaoyao/article/details/80047737?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

https://blog.csdn.net/cshichao/article/details/9979621?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param

其他的我就不寫了,因為我看過之後,問題前半部分一樣,但是後面不一樣了就,(當然我也按著他們的來了一下,還是會出問題)於是我就接著檢查和官方給的步驟,哪不一樣,

後來發現當時寫的時候,有一點是不太明白

這句話中的mBaiduMap是怎麼來的,我就又上網搜了搜(還看了看以前搜的百度地圖定位的案例程式碼),後來終於找到了

1.首先是需要在程式碼的開始,定義一下

2.然後獲取地圖層

然後才能使用他,完成我剛才不確定的那段程式碼

//開啟地圖的定點陣圖層
mBaiduMap.setMyLocationEnabled(true);

完整的MainActivity.java

package com.example.express_delivery;

import androidx.appcompat.app.AppCompatActivity;

import android.companion.WifiDeviceFilter;
import android.os.Bundle;

import com.baidu.location.BDAbstractLocationListener;
import com.baidu.location.BDLocation;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;

public class MainActivity extends AppCompatActivity {

    private MapView mMapView = null;

    private BaiduMap mBaiduMap;
    private LocationClient mLocationClient;
    private MyLocationListener mLocationListener;
    //是否是第一次定位,如果是第一次定位的話要將自己的位置顯示在地圖的中間
    private boolean isFirstLocation = true;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //在使用SDK各元件之前初始化context資訊,傳入ApplicationContext
        //注意該方法要在setContextView 方法之前實現
        SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.activity_main);

        //獲取地圖控制元件引用
        mMapView = findViewById(R.id.bmapView);
        mBaiduMap = mMapView.getMap();
        //開啟地圖的定點陣圖層
        mBaiduMap.setMyLocationEnabled(true);
        //initLocation();

        //定位初始化
        mLocationClient = new LocationClient(this);

        //通過LocationClientOption設定LocationClient相關引數
        LocationClientOption option = new LocationClientOption();
        option.setOpenGps(true); // 開啟gps
        option.setCoorType("bd09ll"); // 設定座標型別
        option.setScanSpan(1000);

        //設定locationClientOption
        mLocationClient.setLocOption(option);

        //註冊LocationListener監聽器
        MyLocationListener myLocationListener = new MyLocationListener();
        mLocationClient.registerLocationListener(myLocationListener);
        //開啟地圖定點陣圖層
        mLocationClient.start();

    }

    private void initLocation() {
        //定位初始化
        mLocationClient = new LocationClient(this);

        //通過LocationClientOption設定LocationClient相關引數
        LocationClientOption option = new LocationClientOption();
        option.setOpenGps(true); // 開啟gps
        option.setCoorType("bd09ll"); // 設定座標型別
        option.setScanSpan(1000);

        //設定locationClientOption
        mLocationClient.setLocOption(option);

        //註冊LocationListener監聽器
        MyLocationListener myLocationListener = new MyLocationListener();
        mLocationClient.registerLocationListener(myLocationListener);
        //開啟地圖定點陣圖層
        mLocationClient.start();
    }


    public class MyLocationListener extends BDAbstractLocationListener{
        @Override
        public void onReceiveLocation(BDLocation location){
            //mapView 銷燬後不再處理新接收的位置
            if(location == null || mMapView == null){
                return;
            }
            MyLocationData locData = new MyLocationData.Builder()
                    .accuracy(location.getRadius())
                    // 此處設定開發者獲取到的方向資訊,順時針0-360
                    .direction(location.getDirection()).latitude(location.getLatitude())
                    .longitude(location.getLongitude()).build();
            mBaiduMap.setMyLocationData(locData);

            if(isFirstLocation){
                //獲取經緯度
                LatLng ll = new LatLng(location.getLatitude(),location.getLongitude());
                MapStatusUpdate status = MapStatusUpdateFactory.newLatLng(ll);
                //mBaiduMap.setMapStatus(status);//直接到中間
                mBaiduMap.animateMapStatus(status);//動畫的方式到中間
                isFirstLocation = false;

            }
        }
    }


    @Override
    protected void onResume(){
        super.onResume();
        //在activity執行onResume 時,執行mMapView.onResume(),實現地圖生命週期管理
        mMapView.onResume();

    }

    @Override
    protected void onPause(){
        super.onPause();
        //在activity執行onPause 時,執行mMapView.onPause(),實現地圖生命週期管理
        mMapView.onPause();

    }

    @Override
    protected void onDestroy(){
        super.onDestroy();
        mLocationClient.stop();
        mBaiduMap.setMyLocationEnabled(false);
        //在activity執行onDestroy 時,執行mMapView.onDestroy(),實現地圖生命週期管理
        mMapView.onDestroy();
        mMapView = null;

    }
}
View Code