Нужен совет по действиям и как сделать его общим

Я создаю общее место/класс для всех действий, которые могут произойти, когда пользователь нажимает опцию AlertDialog. Я нашел это ссылка, но на самом деле это не помогает мне понять концепцию. Это то, что я хочу сделать.

  1. У меня есть класс (ClassA), который наследуется от Activity, и другой класс (ClassB), который наследуется от ListActivity.
  2. У меня появляется диалоговое окно предупреждения независимо от того, откуда оно вызывается.
  3. Я создал класс BaseRootActivity, который расширен в ClassA. Поскольку ClassB расширяется от класса RootListActivity, я не могу вызывать методы, находящиеся внутри BaseRootActivity, особенно те, которые используют контекстные методы.

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


person vikramjb    schedule 11.04.2012    source источник


Ответы (1)


Вы всегда должны предпочитать композицию наследованию. Итак, у вас есть два хороших варианта:

  • Просто поместите логику диалога в третий класс, который вы будете использовать из ваших ClassA и ClassB (не расширяя его, а просто используя).
  • Используйте Fragments API (вы можете использовать библиотеку совместимости, чтобы сделать ее доступной на старых версии Android); там вы можете найти класс под названием DialogFragment, который в основном заставляет вас создавать диалоги для отдельных классов (кстати, это отличная идея), и это поможет вам справиться с проблемами, с которыми вы можете столкнуться, если вы решите следовать первому варианту.
person Cristian    schedule 11.04.2012
comment
Я пытался поместить его в третий класс. Но мне нужно, чтобы getBaseContext() не был нулевым, чтобы создавать диалоги и создавать намерения. Когда метод находится в третьем классе, getBaseContext() не равен нулю. Я посмотрю на библиотеку совместимости и посмотрю, работает ли она. Спасибо за быстрый ответ. - person vikramjb; 11.04.2012
comment
Хорошо... но не могли бы вы немного подробнее объяснить проблему с getBaseContext()? На самом деле, зачем вам нужен getBaseContext()? Почему бы вам просто не передать ссылку на активность? - person Cristian; 11.04.2012
comment
Всегда говорилось, что активность как таковая не должна передаваться в качестве ссылки из-за проблем с памятью. Раньше у меня были серьезные проблемы с памятью, когда я передавал активность другому классу. - person vikramjb; 11.04.2012
comment
У меня никогда не было проблем с диалогами, в конце концов, они почти привязаны к активности, которая их открывает. - person Cristian; 11.04.2012
comment
Я не думаю, что это диалог, который вызовет проблему. Я читал на сайте Android, не знаю где, что мы не должны передавать getBaseContext() другим методам или классам как таковым, и это может вызвать утечку памяти. Это неправильно? - person vikramjb; 11.04.2012
comment
Ну... об этом много информации. Что заставляет меня задаться вопросом, почему вы используете getBaseContext() вместо прямой ссылки на действие (MyActivity.this). Например, когда вы используете Fragments API, в каждом диалоговом окне есть ссылка на активность, и если инженеры Android решили это сделать, то все должно быть в порядке. - person Cristian; 11.04.2012
comment
Правда, мне это кажется логичным. Я внесу изменения, протестирую и дам вам знать. Спасибо за всю помощь. Ценить это. - person vikramjb; 11.04.2012
comment
pastebin.com/zPE0FuV0 — это то, что я сделал. Это работает, но это хороший дизайн? - person vikramjb; 11.04.2012
comment
Типа... UtilClass не нужно расширять Activity: pastebin.com/dMff9e2F - person Cristian; 11.04.2012
comment
Круто @Cristian, я внесу изменения в реальное приложение и посмотрю, как оно пойдет. Спасибо за вашу помощь. ;) - person vikramjb; 12.04.2012
comment
наконец-то у меня все заработало. Спасибо большое за помощь. Причина, по которой я не прошел Контекст, заключается в том, что я где-то читал, что это может привести к утечке памяти, поэтому я опасался. Посмотрим, как это пойдет. Еще раз спасибо. - person vikramjb; 12.04.2012