input text в контейнере

Обсуждение и помощь по вопросам взаимодействия с ВКонтакте API в Flash-приложениях (ActionScript)
Ответить
rewad
Сообщения: 62
Зарегистрирован: 17 май 2010, 22:56

input text в контейнере

Сообщение rewad »

когда у меня в приложение находится только inputtext то нормально вводится текст,а когда добовляю List то почему то не работает,как решить проблему?
corenet
Сообщения: 32
Зарегистрирован: 18 июл 2010, 17:33

Re: input text в контейнере

Сообщение corenet »

Судя по сообщениям отсюда http://vkontakte.ru/topic-1_21734350 Flash-контейнер для приложений
такая проблема возникает у многих.
Я прочитал все сообщения, их там чуть больше 1000, два дня читал.
Там люди дают рецепты как избавиться от этой проблемы.
Эти рецепты я сохранял в текстовой файл, вот пригодилось.

не работают input-текстовые поля!
Да, есть проблемы со стандартным TextInput. А Вы пробовали использовать TextField типа Input? Если интересно мое мнение, я вообще не рекомендую использовать стандартные компоненты из-за их глючности и большого объема ненужного кода. Советую писать собственные компоненты, и будет все работать. Есть глюки в Safari под Маком, но они в какой-то степени разрешимы, но пока это опять-таки не самая серьезная проблема.

в опере не работают input-текстовые поля
причина неработания поля ввода найдена - наличие в флешке стандартного компонента DataGrid. Не используйте стандартные компоненты!

2 Андрей Рогозов.

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

package {
//в этом классе нет ни одного UIComponent, но ошибка все равно возникает
import flash.display.Sprite;
import flash.events.Event;
import flash.events.FocusEvent;
import flash.text.TextField;
import flash.text.TextFieldType;
import flash.system.SecurityDomain;

public class Main extends Sprite {
public function Main():void {
super.addEventListener(Event.ADDED_TO_STAGE, this._init);
}

private function _init(e:Event = null):void {
super.removeEventListener(Event.ADDED_TO_STAGE, this._init);
var tF:TextField = new TextField();
tF.y = 50;
tF.width = 200;
tF.height = 22;
tF.multiline = false;
tF.background = true;
tF.border = true;
tF.type = TextFieldType.INPUT;
super.addChild(tF);
super.stage.addEventListener(FocusEvent.MOUSE_FOCUS_CHANGE, this._onFocusChange);
}

private function _onFocusChange(e:FocusEvent):void{
// вот тут возникает ошибка
}
}
}

*** Нарушение безопасности изолированной среды ***
SecurityDomain "http://vkontakte.ru/app666016" пытался получить доступ к несовместимому контексту "http://cs4328.vkontakte.ru/u1198614/5c75c731d15953.zip"

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

Проблема в способе загрузки флэшки. Пропишите грамотно SecurityDomain.

Далее, глянул ваш код:
1. Вы не удаляете слушателей, они остаются висеть в памяти. Например, такая конструкция:

_tween.addEventListener(TweenEvent.MOTION_FINISH, function (event:TweenEvent) : void
{
if (config.scale < 1)
{
var _loc_2:* = config.scale;
loader.scaleY = config.scale;
loader.scaleX = _loc_2;
}
addChild(loader);
removeChild(_progressBar);
loaded = true;
if (location)
{
onLocationChanged(location);
}
return;
}

оставляет эту функцию в памяти навсегда так же, как и экземпляр _tween. Нужно отписать _tween от этой функции внутри самой функции и обнулить _tween, на форуме flasher.ru есть элегантные решения, как это сделать.
Такие конструкции вообще не рекомендованы к использованию из-за особенностей работы сборщика мусора.

В остальных случаях тоже не нужно пренебрегать отпиской от событий (подписались, функцию выполнили, отписались), т. к. у флэшового GC проблемы с удалением объектов, подписанных друг на друга, из памяти.
--------------
а это нормально что под враппером не работают компоненты TextInput и TextArea?

нельзя ничего напечатать в них.
ОТВЕТ:
используйте TextField ;)

TextField с type==TextFieldType.INPUT тоже не работает.

Да тут комплексная проблема, ComboBox не работает тоже...

Вот решение с прошлой страницы
root.addEventListener(MouseEvent.MOUSE_OVER, function (event:Event)
{
wrapper.parent.stageFocusRect = false;
wrapper.parent.focus = event.currentTarget;
});
-----------
я использую чуть улучшенный хак:

root.addEventListener(MouseEvent.MOUSE_OVER, function (event:Event)
{
wrapper.parent.stageFocusRect = false;
if (!(wrapper.parent.focus is TextField) || (wrapper.parent.focus.type != TextFieldType.INPUT))
wrapper.parent.focus = event.currentTarget;
});

иначе у меня фокус улетал из TextField при уведении с него курсора
rewad
Сообщения: 62
Зарегистрирован: 17 май 2010, 22:56

Re: input text в контейнере

Сообщение rewad »

не очень понял куда этот код вставить?
Аватара пользователя
Doker
Модератор
Модератор
Сообщения: 1026
Зарегистрирован: 07 май 2010, 18:53

Re: input text в контейнере

Сообщение Doker »

http://flapps.ru/forum/post5188.html
вот! такаячже проблема была
все решается 33 строчками кода
Ответить