java.lang. IllegalArgumentException: Представление, не присоединенное к менеджеру окон

Ничего себе, какова вероятность того, что я буквально за последний час внедрил undo / redo в текстовом редакторе WYSIWYG:

Основная идея - либо сохранить все содержимое текстового редактора в массиве , или разницу между последним правлением.

Обновите этот массив в значительных точках, то есть каждый несколько символов (проверьте длину содержимого каждого нажатия клавиши, если его более чем на 20 символов отличаются, то создайте точку сохранения ). Также при изменении стиля (если используется расширенный текст), добавление изображений (если это разрешено), вставка текста и т. Д. Вам также нужен указатель (просто переменная int), чтобы указать, какой элемент в массиве является текущим состоянием editor)

Сделать массив заданной длиной. Каждый раз, когда вы добавляете точку сохранения, добавьте ее в начало массива и переместите все остальные точки данных на один. (последний элемент в массиве будет забыт, как только у вас будет столько точек сохранения).

Когда пользователь нажимает кнопку отмены, проверьте, совпадают ли текущие содержимое редактора с последним сохранением (если это не так, то пользователь внес изменения со времени последнего сохранения, поэтому сохраните текущее содержимое редактора (чтобы его можно было переделать), сделайте редактор равным последней точке сохранения и сделайте указатель variable = 1 (2-й элемент в массиве) .Если они такие же, то никаких изменений со времени последнего сохранения не было, поэтому вам нужно отменить до этой точки. Чтобы сделать это, увеличьте значение указателя + 1, и сделайте содержимое редактора = значение указателя.

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

Если пользователь вносит изменения после отмены, то перемещайте ячейку массива с указанным значением до ячейки 0 и переместите остальную часть на ту же сумму (вы не хотите, чтобы t o повторить другие действия, если они внесли разные изменения).

Еще одна важная точка улова - убедитесь, что вы добавили только точку сохранения, если содержимое текстового редактора действительно изменилось (в противном случае вы получите дубликат сохранить точки, и похоже, что отмена ничего не делает для пользователя.

Я не могу помочь вам с java-спецификой, но я рад ответить на любые другие ваши вопросы,

Нико

146
задан alex2k8 30 April 2010 в 14:15
поделиться

2 ответа

Я думаю, что ваш код правильный, в отличие от другого предложенного ответа. onPostExecute будет выполняться в потоке пользовательского интерфейса. В этом весь смысл AsyncTask - вам не нужно беспокоиться о вызове runOnUiThread или работе с обработчиками. Кроме того, согласно документации, dismiss () можно безопасно вызывать из любого потока (не уверен, что они сделали это исключением).

Возможно, это проблема времени, когда dialog.dismiss () вызывается после того, как действие больше не отображается?

Как насчет проверки того, что произойдет, если вы закомментируете setOnCancelListener, а затем выйдете из действия во время выполнения фоновой задачи ? Затем ваш onPostExecute попытается закрыть уже закрытый диалог. Если приложение вылетает, вы, вероятно, можете просто проверить, открыто ли диалоговое окно, прежде чем закрыть его.

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

2
ответ дан 23 November 2019 в 22:42
поделиться

alex,

Я могу ошибаться, но я подозреваю, что многие телефоны "в природе" имеют ошибку, которая заставляет их менять ориентацию на приложениях, которые помечены как статически ориентированные. Это происходит довольно часто на моем личном телефоне и на многих тестовых телефонах, которые использует наша группа (включая droid, n1, g1, hero). Обычно приложение, помеченное как статически ориентированное (возможно, вертикально), на секунду-другую переходит в горизонтальную ориентацию, а затем сразу же переключается обратно. В итоге, даже если вы не хотите, чтобы ваше приложение меняло ориентацию, вы должны быть готовы к тому, что оно может это сделать. Я не знаю, при каких именно условиях можно воспроизвести такое поведение, не знаю, характерно ли оно для какой-то версии Android. Я знаю только, что видел это множество раз :(

Я бы рекомендовал использовать решение, представленное в ссылке, которую вы разместили, которое предлагает переопределить метод Activity onCreateDialog и позволить Android OS управлять жизненным циклом ваших диалогов. Мне кажется, что даже если вы не хотите, чтобы ваша активность меняла ориентацию, она все равно где-то ее меняет. Вы можете попытаться найти метод, который всегда будет предотвращать переключение ориентации, но я пытаюсь сказать вам, что лично я не верю, что существует надежный способ, который работает на всех существующих на рынке телефонах Android.

2
ответ дан 23 November 2019 в 22:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: