Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 初始化和使用来自另一个活动的FragmentActivity的功能_Java_Android_Google Maps_Android Fragments_Nullpointerexception - Fatal编程技术网

Java 初始化和使用来自另一个活动的FragmentActivity的功能

Java 初始化和使用来自另一个活动的FragmentActivity的功能,java,android,google-maps,android-fragments,nullpointerexception,Java,Android,Google Maps,Android Fragments,Nullpointerexception,请告诉我你对此的看法。。 我制作了一个带有谷歌地图片段活动(MapsActivity)和另外两个活动(MainActivity、MapsContainerActivity)的应用程序 主要活动是带有ListView的主页。本质上,ListView有一个项目,单击该项目时。。将启动转到MapsContainerActivity的意图 在MapsActivity中,我有一个OnMapLongClick的实现,只需在单击位置添加一个标记。。。如果我直接从Main活动启动MapsActivity,它是完

请告诉我你对此的看法。。 我制作了一个带有谷歌地图片段活动(MapsActivity)和另外两个活动(MainActivity、MapsContainerActivity)的应用程序 主要活动是带有ListView的主页。本质上,ListView有一个项目,单击该项目时。。将启动转到MapsContainerActivity的意图

在MapsActivity中,我有一个OnMapLongClick的实现,只需在单击位置添加一个标记。。。如果我直接从Main活动启动MapsActivity,它是完全功能性的,但是,当我尝试从MapsContainer活动访问OnMapLongClick的功能时,它会导致NullPointerException

下面是MainActivity.java:

public class MainActivity extends AppCompatActivity
        implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener{

    GoogleApiClient mGoogleApiClient;
    Location mLastLocation;

    //ListView stuff
    ListView locationsListView;
    static ArrayList<String> locationsList;

    double lat = 0;
    double lng = 0;

    protected void onStart() {
        mGoogleApiClient.connect();
        super.onStart();
    }

    protected void onStop() {
        mGoogleApiClient.disconnect();
        super.onStop();
    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        locationsListView = (ListView) findViewById(R.id.locationsListView);

        locationsList = new ArrayList<>();
        locationsList.add("Add a new place...");

        ArrayAdapter arrayAdapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,locationsList);

        locationsListView.setAdapter(arrayAdapter);


        locationsListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                Intent intent = new Intent(getApplicationContext(),MapsContainerActivity.class);
                intent.putExtra("locationInfo",position);
                startActivity(intent);



            }

        });



        // Create an instance of GoogleAPIClient.
        if (mGoogleApiClient == null) {
            mGoogleApiClient = new GoogleApiClient.Builder(this)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .addApi(LocationServices.API)
                    .build();
        }

    }

    public void getLocation(View view){
        if(lat != 0 && lng != 0){
            Intent intent = new Intent(MainActivity.this,MapsActivity.class);
            intent.putExtra("Latitude", lat);
            intent.putExtra("Longitude", lng);

            startActivity(intent);
        }else {
            Toast.makeText(getApplicationContext(),"Location not retrieved, try again!",Toast.LENGTH_LONG).show();
        }
    }

    @Override
    public void onConnected(Bundle connectionHint) {

        mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
                mGoogleApiClient);
        if (mLastLocation != null) {

            Log.i("Latitude",mLastLocation.getLatitude()+"");
            lat = mLastLocation.getLatitude();

            Log.i("Longitude",mLastLocation.getLongitude()+"");
            lng = mLastLocation.getLongitude();
        }
    }


    @Override
    public void onConnectionSuspended(int i) {

    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

    }

}
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, GoogleMap.OnMapLongClickListener {


    public MapsActivity(Context context){

    }


    Geocoder geocoder;
    int selectedItem = -1;
    private GoogleMap mMap;
    double lat = 10;
    double lng = 10;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps_container);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);

        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

        Intent intent = getIntent();
        lat = intent.getDoubleExtra("Latitude", 0);
        lng = intent.getDoubleExtra("Longitude", 0);

        selectedItem = intent.getIntExtra("locationInfo", -1);
    }



    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        if (selectedItem != 0 && selectedItem != -1) {
            mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lng), 8));
        }
        mMap.setOnMapLongClickListener(this);

        // Add a marker in Sydney and move the camera

        mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lng), 8));
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        ActionBar actionBar = getActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);
        return super.onCreateOptionsMenu(menu);

    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {

            case android.R.id.home:
                this.finish();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    @Override
    public void onMapLongClick(LatLng point) {
        geocoder = new Geocoder(getApplicationContext(), Locale.getDefault());
        String label = new Date().toString();
        try {
            if (geocoder != null) {
                List<Address> listAddresses = geocoder.getFromLocation(point.latitude, point.longitude, 1);


                if (listAddresses != null && listAddresses.size() > 0) {
                    label = listAddresses.get(0).getAddressLine(0);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        if(label == null){
            label = new Date().toString();
        }
        mMap.addMarker(new MarkerOptions()
                .position(point)
                .title(label)
                .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));
        Log.i("Latitude", " " + point.latitude);
        Log.i("Latitude", " " + point.longitude);
    }
}

是什么阻止你在MapsActivity中创建工具栏?好消息!!!我解决了这个问题。。。我所做的只是。。。我创建了一个
Geocoder
对象,并在MapsContainerActivity的onCreate()和MapsActivity中对其进行了初始化。然后,我更改了MapsActivity的构造函数以接受另一个Geocoder类型的参数,然后我将MapsContainerActivity的Geocoder对象传递给MapsActivity,并将其分配给MapsActivity中的Geocoder对象,最后我从中的onMapLongClick()方法中删除了Geocoder初始化MapsActivity@HristoStoyanov我试着去做,但我做不到,因为这是一项零碎的活动,我只是不知道如何在其中实现工具栏。。。所以我创建了一个新的布局,非常类似于activity_main。。使用CoordinatorLayout,我包括了包含地图碎片的布局,我在使用应用程序上下文时看到了这个错误。尝试使用
活动
上下文。感谢@hristotoyanov让我想起它,将功能放在一个类中。。。我做到了,现在它工作得很好!
public class MapsContainerActivity extends AppCompatActivity {

    private MapsActivity mapsActivity;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps_container);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);

        mapsActivity = new MapsActivity(this);
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);

        mapFragment.getMapAsync(mapsActivity);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {


        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu_main, menu);  // <--
        return true;

    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){

            case android.R.id.home:
                this.finish();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
}
 java.lang.NullPointerException
 at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:114)
 at com.firashashash.myapplication.MapsActivity.onMapLongClick(MapsActivity.java:109)
 at com.google.android.gms.maps.GoogleMap$24.onMapLongClick(Unknown Source)
 at com.google.android.gms.maps.internal.zzs$zza.onTransact(Unknown Source)
 at android.os.Binder.transact(Binder.java:361)
 at com.google.android.gms.maps.internal.bt.a(:com.google.android.gms.DynamiteModulesB:93)
 at com.google.maps.api.android.lib6.gmm6.api.ac.a(:com.google.android.gms.DynamiteModulesB:468)
 at com.google.maps.api.android.lib6.gmm6.vector.af.d(:com.google.android.gms.DynamiteModulesB:700)
 at com.google.maps.api.android.lib6.gmm6.vector.df.onLongPress(:com.google.android.gms.DynamiteModulesB:341)
 at com.google.maps.api.android.lib6.impl.gesture.g.onLongPress(:com.google.android.gms.DynamiteModulesB:179)
 at com.google.maps.api.android.lib6.impl.gesture.i.handleMessage(:com.google.android.gms.DynamiteModulesB:3579)
 at android.os.Handler.dispatchMessage(Handler.java:102)
 at android.os.Looper.loop(Looper.java:157)
 at android.app.ActivityThread.main(ActivityThread.java:5356)
 at java.lang.reflect.Method.invokeNative(Native Method)
 at java.lang.reflect.Method.invoke(Method.java:515)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
 at dalvik.system.NativeStart.main(Native Method)