как вызвать функцию из другой активности андроида - PullRequest
0 голосов
/ 08 сентября 2018

В моем приложении для Android у меня есть два действия:

1) MapsActivity
2) ДругоеДеятельность

MapsActivity имеет навигационный ящик, через который я открыл OtherActivity . Теперь я хочу вызвать метод (например, updatemap () ) из MapsActivity .

После долгих поисков в Google я нашел этот вопрос на stackoverflow Как вызвать метод в основной деятельности из другой деятельности? но это не решает мою проблему.

ОБНОВЛЕНИЕ:

Вот код для 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{ ... }
}

Код для MapsActivity:

  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() { ... }

  }

Я вставляю только структуру кода, потому что это 1000 строк кода, и вставка здесь бесполезна и становится более сложной для чтения.

Я пытался добавить ключевое слово static перед методом displayLocation, но оно выдает ошибку в переменных внутри функции, и сделать каждую переменную глобальной не представляется возможным.

Ответы [ 3 ]

0 голосов
/ 08 сентября 2018

Имейте в виду, вы можете получить NullObjectRefernce, если другое действие закрыто.

для этого вы можете использовать public static метод. так что вы можете позвонить из любой точки приложения.

в вашей деятельности добавьте его.

public static void YOUR_NAME(){}

чтобы вызвать его во втором упражнении, добавьте его.

   try{
    YOUR_ACTIVITY.YOUR_NAME();

    }catch(Exception e){}

другое решение, вы можете использовать EventBus library

https://github.com/greenrobot/EventBus

0 голосов
/ 08 сентября 2018

Если MapsActivity ожидает результата от OtherActivity, вам лучше использовать Получение результата от действия . Просто позвоните OtherActivity через startActivityForResult() (вместо startActivity()):

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

Тогда в вашем MapsActivity сделайте это:

@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();
        }
    }
}
0 голосов
/ 08 сентября 2018

Сделать статическую функцию в одном действии, как

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

Тогда в другом упражнении назовите это:

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

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...