Метод переопределения, когда макет уничтожен в Android - PullRequest
37 голосов
/ 25 января 2012

У меня есть пользовательский компонент, который расширяет LinearLayout, мне нужно выполнять определенные операторы, когда Layout уничтожен или удален.(или собирается быть удаленным)

Один из способов - проверить onPause () или onDestroy () действия и вызвать методы пользовательского компонента.Но я хочу снять эти накладные расходы с деятельности.Так что сам пользовательский компонент может обрабатывать, когда макет отсоединен.Но я не могу найти подходящий метод для переопределения (обнаружения события) при удалении макета.Есть ли способ справиться с этим, или нам нужно использовать метод действия onPause () и onResume ()?

Ответы [ 3 ]

74 голосов
/ 24 мая 2013

Я успешно переопределил методы onAttachedToWindow() и onDetachedFromWindow():

@Override
protected void onAttachedToWindow() {
    super.onAttachedToWindow();
    // View is now attached
}

@Override
protected void onDetachedFromWindow() {
    super.onDetachedFromWindow();
    // View is now detached, and about to be destroyed
}
9 голосов
/ 25 января 2012

Вы можете иметь свой собственный вид слушать свои собственные события.Я предлагаю использовать View.OnAttachStateChangeListener и прослушивать событие onDetach.

@Override
void onViewDetachedFromWindow(View v) {
 doCleanup();
}
5 голосов
/ 25 января 2012

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

Но если вы действительно хотите связать свой компонент с этим жизненным циклом , я предлагаю вашему компоненту реализовать интерфейс (что-то вроде Removable) и сделать что-то подобное в своей базовой деятельности (что все ваша деятельность расширяется):

protected Set<Removable> myRemovableItems = new HashSet<Removable>();

@Override
public void onPause() {
    super.onPause();
    for (Removable removable : myRemovableItems) {
        removable.remove();
    }
}

Интерфейс:

public interface Removable {
    void remove();
}

Затем каждый раз, когда вы добавляете один из своих пользовательских компонентов из действия, вы добавляете компонент во внутренний набор Removable действия, и его метод remove будет автоматически вызываться при каждой приостановке действия.

Это позволит вам указать, что делать, когда onPause вызывается внутри самого компонента. Но это не гарантирует, что оно автоматически будет называться , для этого вам придется сделать это в упражнении.

Примечание: вы можете использовать onStop вместо onPause в зависимости от того, когда вы хотите, чтобы произошло удаление.

...