Перенос вызова Toast из переопределенного View в Activity

Ответить
Аватара пользователя
andev
Сообщения: 219
Зарегистрирован: 13 янв 2012, 17:56

Перенос вызова Toast из переопределенного View в Activity

Сообщение andev » 06 июн 2012, 10:37

Подскажите, пожалуйста.
У меня есть свой компонент, унаследованный от View:

Код: Выделить всё

public class MyView extends View {
    public MyView(Context context, String type) {
        super(context);
        
        this.context = context;
        this.type = type;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
            float current_x = event.getX();
            float current_y = event.getY();

            if (true) { // некоторое условие
				Toast.makeText(context, "UP!", Toast.LENGTH_LONG).show();
			}
            return true;
    }
}
Я располагаю данный компонент на Activity вот таким образом:

Код: Выделить всё

 @Override
 public void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_ticket);
        
	MyView mv = new MyView(getApplicationContext(), "someType");
	relativeLayout_1.addView(mv);
}
Toast вызывается, но мне хочется реализовать некий механизм, с помощью которого можно при выполнении условия в MyView вызывать произвольный метод в Activity, я бы перенес в этот метод Toast и поместил бы в него другие необходимые вещи.

Prospekt
Сообщения: 41
Зарегистрирован: 30 май 2012, 23:06

Re: Перенос вызова Toast из переопределенного View в Activit

Сообщение Prospekt » 06 июн 2012, 11:16

На мой взгляд нужно поступить так:

1) в ваш View добавить ссылку на Активити.
2) при самостоятельном помещении элемента на Активити нужно передавать этому элементу адрес Активити.
3) после этого вам ничего не будет мешать вызывать методы активити из View.

К пунку 2) если элемент помещен не вами, а через разметку, сначало необходимо получить доступ к нему из активити через findViewById(...).

Плюс к этому нужно помнить о жизненных циклах активити и самого визуального элемента (иногда). Если у Активити реализовать интерфейс SurfaceHolder.Callback, то оно сможет обрабатывать изменение собития жизненного цикла и свои и SurfaceView.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Перенос вызова Toast из переопределенного View в Activit

Сообщение KamiSempai » 06 июн 2012, 12:00

Как вариант можно передавать в качестве параметра сontext не getApplicationContext() а this.
Внутри MyView сделать примерно следующее:

Код: Выделить всё

public class MyView extends View {
    private MyActivity mMyActivity;
    public MyView(Context context, String type) {
        super(context);

        mMyActivity = (MyActivity) context;

        this.context = context;
        this.type = type;
    }
Теперь через mMyActivity можно получить доступ к любому public методу.
Если MyView используется в нескольких Activity, нужно будет создать абстрактный класс MyActivity с описаниями всех используемых методов и наследовать новые активности не от Activity, а от MyActivity.

PS: Можно еще попробовать интерфейс использовать.

PPS: onTouchListner тут ни как не подходит?
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
andev
Сообщения: 219
Зарегистрирован: 13 янв 2012, 17:56

Re: Перенос вызова Toast из переопределенного View в Activit

Сообщение andev » 06 июн 2012, 13:02

Prospekt, спасибо сработало.
KamiSempai, ваш вариант, естественно, тоже сработал
PPS: onTouchListner тут ни как не подходит?
Вроде нет. Это, если помните, та задача стирания защитного слоя, которую вы мне подсказали некоторое время назад. Сейчас появилась необходимость в определенной точке (x, y) стирания выполнять некоторые действия.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Перенос вызова Toast из переопределенного View в Activit

Сообщение KamiSempai » 06 июн 2012, 14:01

andev писал(а):Сейчас появилась необходимость в определенной точке (x, y) стирания выполнять некоторые действия.
Всплеск шампанского, фанфары и конфети при стирании определенной области? :)
Я бы тогда интерфейс сделал. Что то вроде LotteryLayout.onOpenLayoutEvent. Создаем его в активности, ложим в объект (setOpenLayoutOnEvent()) и все.
Объект получится более универсальным и не будет привязан к конкретной Activity, и его можно будет использовать повторно без каких либо изменений.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
andev
Сообщения: 219
Зарегистрирован: 13 янв 2012, 17:56

Re: Перенос вызова Toast из переопределенного View в Activit

Сообщение andev » 07 июн 2012, 02:14

KamiSempai писал(а):
andev писал(а):Сейчас появилась необходимость в определенной точке (x, y) стирания выполнять некоторые действия.
Всплеск шампанского, фанфары и конфети при стирании определенной области? :)
в точку
Фидбэк от заказчика
С самого первого ТЗ требовался некий небольшой полу-игровой процесс стирания, чтобы стирать билет было интересно. Сейчас стирание билета не является ни игровым, ни интересным. Сделайте так, чтобы стирать билет это было прикольно, интересно и понятно для пользователя, чтобы был понятен момент выигрыша.
Вот так и живем :(

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Перенос вызова Toast из переопределенного View в Activit

Сообщение KamiSempai » 07 июн 2012, 06:53

andev писал(а):Вот так и живем :(
Это нормально. Я бы на месте заказчика поставил эту задачу одной из приоритетных.
Именно такие маленькие радости будут заставлять игрока играть снова и снова.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
andev
Сообщения: 219
Зарегистрирован: 13 янв 2012, 17:56

Re: Перенос вызова Toast из переопределенного View в Activit

Сообщение andev » 07 июн 2012, 07:26

KamiSempai писал(а):
andev писал(а):Вот так и живем :(
Это нормально. Я бы на месте заказчика поставил эту задачу одной из приоритетных.
Именно такие маленькие радости будут заставлять игрока играть снова и снова.
есть еще "большие" радости, к примеру модель расчета выигрыша, придуманная менеджером (!) за 1 минуту (!!) и реализованная на серверной стороне. Согласно ей, с каждого билета можно выиграть либо 0, либо (TICKET_COST - 10% (TICKET_COST))
Как считаете, долго будут играть пользователи, покупая каждый билет за 5 рублей и выигрывая с каждого либо 0, либо 4 рубля, пусть каким бы красивым ни было стирание билета?

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Перенос вызова Toast из переопределенного View в Activit

Сообщение KamiSempai » 07 июн 2012, 09:59

Да уж. По мне, так наоборот нужно увеличивать шанс выйгрыша для первых билетов, а потом подогревать азарт периодическими выйгрышами.
А тут какойто лохотрон получается. И ведь не докажешь ничего, вся логика на сервере. Если только маски шоу устраивать, с конфискацией серверов, но это никому не нужно, да и разрешение на это никто не даст.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Ответить