Подтвердить что ты не робот

Способ переопределения при уничтожении макета в Android

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

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

4b9b3361

Ответ 1

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

Но если вы действительно хотите привязать свой компонент к этому жизненному циклу, я предлагаю вашему компоненту реализовать интерфейс (что-то вроде 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 в зависимости от того, когда вы хотите, чтобы удаление произошло.

Ответ 2

Я успел переопределить методы 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
}

Ответ 3

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

@Override
void onViewDetachedFromWindow(View v) {
 doCleanup();
}