En mi aplicación de Android tengo dos actividades:

1) MapsActivity
2) Otra actividad

MapsActivity tiene un cajón de navegación a través del cual abrí OtherActivity . Ahora, quiero llamar a un método (como updatemap () ) desde MapsActivity .

Después de buscar mucho en Google, encontré esta pregunta en stackoverflow ¿Cómo llamar al método en la actividad principal desde otra actividad? pero eso no resuelve mi problema.

ACTUALIZACIÓN:

Aquí está el código para OtherActivity:

public class OtherActivity extends AppCompatActivity {
   @Override
   protected void attachBaseContext(Context newBase) {.....}

   @Override
   protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState); 
     .... }

   @Override
   protected void onStart() {
     super.onStart();  
     removeConnection(userID)
     .... }

   private void removeConnection(String currentUserId) { 
     ... 
     // Here I want to call a function from MapsActivity i.e. disaplayLocation()
   }

   public static class ConnectedViewHolder extends 
   RecyclerView.ViewHolder{ ... }
}

El código para MapsActivity es:

  public class MapsActivity extends AppCompatActivity implements 
  OnMapReadyCallback,
  GoogleApiClient.ConnectionCallbacks,
  GoogleApiClient.OnConnectionFailedListener,
  LocationListener {

      @Override
      protected void attachBaseContext(Context newBase) { ... }

      @Override
      protected void onCreate(Bundle savedInstanceState) { ... }

      @Override
      public void onRequestPermissionsResult(int requestCode, @NonNull 
       String[] permissions, @NonNull int[] grantResults) { ... }

      private void setUpLocation() { ... }

      public void displayLocation() { ... }  // This is the function i want to call

      private void createLocationRequest() { ... } 

      @Override
      protected void onActivityResult(int requestCode, int resultCode, Intent data) { ... } 

      protected synchronized void buildGoogleApiClient() { ... } 

      private boolean checkPlayServices() { ... }

      private void requestRuntimePermission() { ... } 

      private void startLocationUpdates()  { ... }

      @Override
      public void onMapReady(GoogleMap googleMap) { ... }

      @Override
      public void onConnected(@Nullable Bundle bundle) { ... }

      @Override
      public void onConnectionSuspended(int i) { ... }

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

      @Override
      public void onLocationChanged(Location location) { ... }

      @Override
      public boolean onCreateOptionsMenu(Menu menu) { ... }

      @Override
      public boolean onOptionsItemSelected(MenuItem item) { ... }

      private void makeConnectionToGetLocation() { ... }

      private void updateConnectedLatLng() { ... }

  }

Estoy pegando solo la estructura de código porque es 1000 líneas de código y pegar aquí es inútil y se vuelve más complicado de leer.

Intenté agregar la palabra clave estática antes del método displayLocation pero da error en las variables dentro de la función y no es posible hacer que todas las variables sean globales.

1
xaif 8 sep. 2018 a las 13:05

3 respuestas

La mejor respuesta

Si MapsActivity espera un resultado de OtherActivity, está mejor con Obtener resultado de una actividad. Simplemente llame a OtherActivity a través de startActivityForResult() (en lugar de startActivity()):

static final int MAP_REQUEST = 1;  // your request code
...
private void callOtherActivity() {
    Intent intent = new Intent(this, OtherActivity.class)
    startActivityForResult(intent, MAP_REQUEST);
}

Luego, en tu MapsActivity, haz esto:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == MAP_REQUEST) {
        // Make sure the request was successful
        if (resultCode == RESULT_OK) {
            updateMap();
        }
    }
}
1
user1506104 8 sep. 2018 a las 10:43

Tenga en cuenta que puede obtener NullObjectRefernce si la otra actividad está cerrada.

Para hacerlo puedes usar el método public static. por lo tanto, puede llamarlo desde cualquier lugar de la aplicación.

En tu actividad agrégala.

public static void YOUR_NAME(){}

Para llamarlo en la segunda actividad, agréguelo.

   try{
    YOUR_ACTIVITY.YOUR_NAME();

    }catch(Exception e){}

Otra solución, puede usar la biblioteca EventBus

https://github.com/greenrobot/EventBus

0
Momen Zaqout 8 sep. 2018 a las 10:22

Hacer una función estática en una actividad como

public static double getVariance(double[] data)
{
    double mean = getMean(data);
    double temp = 0;
    for(double a :data)
        temp += (mean-a)*(mean-a);
    return temp/data.length;
}

Luego, en otra actividad, llámelo como:

double res = Activity1.getVariance(<your data>);

Espero que ayude.

0
driftking9987 8 sep. 2018 a las 10:12