Android: повторное использование одного и того же объекта View в разных действиях (случай с рекламными баннерами) - PullRequest
14 голосов
/ 09 января 2012

Я хочу повторно использовать один и тот же объект представления (не класс представления или файл XML, я имею в виду объект в памяти) в различных действиях.

Я почти сделал это.Дело, конечно, в контексте.

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

Я попытался с какой-то деятельностью, которую я не возражал против утечки, и выдал ее в качестве контекста,Это работало, на самом деле все работало, пока я не начал получать странные исключения во ViewFlipper.

Мой вопрос: возможно ли это повторное использование, и как сделать его стабильным?Есть ли у вас опыт с этим?

Большое спасибо заранее, Дэн

Ответы [ 5 ]

6 голосов
/ 13 января 2012

Я имею в виду, что вы можете позволить себе пропустить 1 действие, так как это единственное решение, которое я знаю: объявите статическое представление, например, myAdView в вашем 1-м действии (в котором вы запрашиваете объявление).Теперь вы можете рекламировать и удалять этот myAdView в каждом переходе деятельности.Конечно, вам придется поддерживать отдельные LinearLayouts для ваших объявлений в отдельных действиях, где мы добавим / удалим myAdView, например.Предположим, вы переходите от действия A к B, затем в onPause A удалите myAdView:

private LinearLayout layoutAd;
layoutAd = (LinearLayout) findViewById(R.id.layout_ad); // from A's xml
protected void onPause() {
    super.onPause();
    layoutAd.removeView(FirstActivity.adBannerView);
}

и в onResume B добавьте то же (FirstActivity) myAdView:

private LinearLayout layoutAd;
layoutAd = (LinearLayout) findViewById(R.id.layout_ad);  // from B's xml
protected void onResume() {
      super.onResume();
      layoutAd.addView(FirstActivity.adBannerView);
}

Надеюсь, что это решитВаша проблема в какой-то степени.

1 голос
/ 17 января 2012

Почему вы не используете фрагменты?

http://developer.android.com/guide/topics/fundamentals/fragments.html

Я думаю, ваш вариант использования идеально подходит для этого.

0 голосов
/ 08 августа 2013

Я в том же деле, что и Данаил.Дело не в том, чтобы взломать провайдера рекламы, а в том, что если вы хотите показывать баннер в разных действиях, лучше всего в рекламе не загружать его каждый раз, когда вы меняете действие, потому что у вас больше показов, поэтому вы получаете CTR (нажмитеЧерез коэффициент) будет уменьшаться.Вы бы предпочли перезагрузить баннер в установленное вами время независимо от изменений активности.

Я думаю, что правильный способ сделать это, как говорит NeTeInStEiN, использовать фрагменты.Вы можете иметь уникальную деятельность, состоящую из разных фрагментов.В одном из фрагментов, например, внизу, у вас будет баннер, и вы фактически загрузите его один раз.Затем в большей области сверху (скажем, у нас на телефоне) вы разместите разные фрагменты, по одному, которые будут соответствовать вашим текущим действиям.Когда вы обычно «меняете» действие, теперь вы просто меняете «основной» фрагмент, но фрагмент баннера остается там без изменений.

Основная и БОЛЬШАЯ проблема этого подхода заключается в том, что вам нужноспроектировать ваше приложение таким образом с самого начала, потому что изменение модели приложения с нескольких действий на одно действие с несколькими фрагментами является довольно большим изменением кода ...:. (

Так что я понимаю, что для затрат на реализациюМожно попытаться «перенести» вид из одного занятия в другое, но, как я видел в других ответах, это действительно не рекомендуется, и это хлопотно ...

0 голосов
/ 09 января 2012

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

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

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

Обновление:

Так как вы определили цель этого вопроса (перехват показа объявлений из сторонней библиотеки), я предлагаю вам сначала связаться с компанией и проверитьУсловия использования.Если они разрешат использовать свои услуги, обходя код Просмотр, они могут предоставить вам API более низкого уровня для показа объявлений, как вы считаете нужным.

Если такое использование запрещено,учтите тот факт, что они могут заблокировать вашу учетную запись (и удержать платеж) за неправильное использование.

Если вы все еще хотите пойти дальше: НЕ взломайте шаблоны пользовательского интерфейса Android, чтобы это сработало.Извлеките рекламные изображения из сторонней библиотеки на стороне сервера (т. Е. Создайте простое размещенное веб-приложение Java с кеш-хранилищем и API-интерфейсом REST) ​​и предоставьте рекламу своему приложению Android из этой службы "посредник".Однако я, конечно, не поддерживаю этот метод.

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

0 голосов
/ 09 января 2012

Если вы хотите, чтобы переменная использовалась в нескольких действиях, лучше всего поместить их в отдельный класс (можно назвать как Constants или MyVars) в качестве статической переменной и использовать их в любом действии, которое вы хотите, например, в качестве констант..SavedVar или MyVars.SavedVar, как показано ниже, является примером кода.

public class MyStaticVars {

public static Context myContext;
}

// First Activity where you want to save a specific context

MyStaticVars.myContext = ContextToBeSaved;

// Any Other Activity where you want to reuse that context

priviousContext = MyStaticVars.myContext;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...