2013-03-23 1 views
0

В заданной активности AlertDialog вводит пользователя в настройки WiFI. Затем пользователь нажимает кнопку «Назад», чтобы вернуться к указанному действию.Сделать вызов метода, как только нажата кнопка возврата (Android)

Однако, как только нажата кнопка «Назад», мне нужно сделать вызов метода. Обратите внимание, что я не могу просто добавить метод после следующего кода в действие, так как это повлияет на время взаимодействия пользователя с экземпляром AlertDialog.

Вызов метода должен произойти, как только кнопка «Назад» была нажата, из меню настроек WIFI. Пожалуйста, сообщите мне, как я могу это реализовать.

Вот код:

alertDialog.setPositiveButton("Settings", new dialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS); 
      startActivity(intent); 
     } 
    }); 

ответ

1

Вы можете Override в onResume() метод вызывающий Activity. Как только пользователь нажмет «назад» button, метод onResume() обязательно будет вызван так, чтобы вы могли поместить свой вызов метода здесь

+0

Метод onResume() вызывается до того, как выполняется код AlertDialog, так как это обычный жизненный цикл активности Android (т. Е. Activity start -> onCreate() -> onStart() -> onResume()). Мне нужен вызов метода после выполнения кода AlertDialog. – androideka

+0

Я понимаю жизненный цикл Android, но в зависимости от того, что вам нужно, вы можете установить флаг для запуска определенного кода в зависимости от того, когда 'onResume()' получает вызов – codeMagic

+0

Если бы вы играли со своей идеей. Это работает сейчас, спасибо. – androideka

0
private boolean inwifisettings; 

public void onClick(DialogInterface dialog, int which) { 
    Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS); 
    inwifisettings = true; 
    startActivity(intent); 
} 

@Override public void onWindowFocusChanged(boolean hasFocus) 
{ 
    if(inwifisettings & hasFocus) 
    { 
     doSomething(); 
     inwifisettings = false; 
    } 
} 

Вы не должны использовать onResume() или startActivityForResult()/onActivityResult() для этой цели. Цитируя Android документации: http://developer.android.com/reference/android/app/Activity.html

общественность недействительного startActivityForResult (Intent намерения, Int requestCode, Bundle варианты)
Обратите внимание, что этот метод должен быть использован только с Намерением протоколов, которые определены для возврата результата. В других протоколах (например, ACTION_MAIN или ACTION_VIEW) вы не можете получить результат, если ожидаете. Например, если действие, которое вы запускаете, использует режим запуска singleTask, оно не будет запускаться в вашей задаче, и вы сразу получите результат отмены.

общественных недействительный onWindowFocusChanged (булево HasFocus)
Это лучший показатель, видна ли пользователь эта деятельность.
система может отображать окна системного уровня (например, панель уведомлений панели состояния или системное предупреждение), которые временно будут принимать фокус ввода окна, не приостанавливая деятельность переднего плана.

+0

Обратите внимание, что решения на основе onActivityResult() работают только при условии, что настройки Wifi диалог launchMode никогда не меняется в будущей версии Android, а решения на основе onResume() предполагают, что диалог настроек Wi-Fi приостановит вашу активность. Платформа Android также не гарантирована. onWindowFocusChanged - правильный способ справиться с этим. –

+0

Это не будет изменено иначе startActivityForResult было бы неплохо. Название метода говорит все, можно было бы ожидать чего-то. –

+0

ACTION_WIFI_SETTINGS НЕ документируется как возвращающий результат.Вы не должны полагаться на недокументированные детали реализации, особенно такие вещи, что никто из команды платформы не ожидает, что кто-то будет полагаться. –

1

член класса

private static final int WIFI_REQUEST = 1234; 

Использование startActivityForResult

alertDialog.setPositiveButton("Settings", new dialogInterface.OnClickListener() { 
    @Override 
    public void onClick(DialogInterface dialog, int which) { 
     Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS); 
     startActivityForResult(intent, WIFI_REQUEST); 
    } 
}); 

В классе активности

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent intent) 
{ 
    super.onActivityResult(requestCode, resultCode, intent); 

    switch (requestCode) 
    { 
     case WIFI_REQUEST: 
       // Call your method here 
       break; 
    } 
} 
+0

Нет никакой гарантии, что диалог настроек Wifi всегда будет запускаться в вашей задаче, а onActivityResult() вызывается сразу после startActivity(), если результирующая активность начинается в своей собственной задаче. См. Решение onWindowFocusChanged ниже. –

+0

Да, если вы вызываете startActivityForResult, вы гарантируете, что ОС называется onActivityResult до onResume. Я только что протестировал onWindowFocusChanged, вызванный afterResume. –

+0

Вы, однако, не заметили, что если в будущем в диалоговом окне настроек Wifi будет установлен другой режим запуска (singleInstance, возможно), то onActivityResult будет вызван немедленно, не дожидаясь, когда пользователь покинет диалог. Поскольку диалог настроек Wi-Fi не документирован как возвращающий результат, вы не должны зависеть от его режима запуска, который остается совместимым с этим решением. –

 Смежные вопросы

  • Нет связанных вопросов^_^