Как разместить AdMob в верхней части экрана (вверху) Android-панели?

I trying to place an AdMob ad at the top of the screen (above) the Android Actionbar. ActionBar AdMob above

  • yellow = ActionBar
  • red = content
  • green = AdMob

A аналогичный вопрос Я нашел, что нужно разместить объявление внизу экрана с появлением Actionbar. Но пока я не мог понять, как разместить его в верхней части экрана.

Я попробовал это так:

private AdView adView;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

   //main view setup
    setContentView(R.layout.main);
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

   //actionbar setup
    ActionBar actionBar = getActionBar();
    actionBar.setTitle("Search");
    actionBar.setDisplayHomeAsUpEnabled(true);

    final LinearLayout content = (LinearLayout) findViewById(android.R.id.content).getParent();

   //Create the adView
    adView = new AdView(this, AdSize.BANNER, "ID");

   //Lookup your LinearLayout assuming it’s been given
   //the attribute android:id="@+id/mainLayout"

   //Add the adView to it
    FrameLayout.LayoutParams parm = (FrameLayout.LayoutParams) content.getLayoutParams();
    parm.gravity = Gravity.TOP;
    content.addView(adView);

   //Initiate a generic request to load it with an ad
    AdRequest adRequest = new AdRequest();
    adRequest.addTestDevice("TEST_DEVICE_ID");
    adView.loadAd(adRequest);
}

Ниже вы можете увидеть часть просмотра иерархии моего приложения. Представление «id/main» - это мой основной макет. Как вы можете видеть на картинке, ActionBar имеет идентификатор, называемый id/action_bar_container. В моем коде выше мне удалось получить доступ к содержимому FrameLayout, но я не смог получить доступ к представлению action_bar_container. Поскольку они находятся на одном уровне иерархии (я думаю), должно быть возможно каким-то образом получить доступ к этому представлению ActionBar.

enter image description here

Но это не сработало:

Without ActionBar displayed

Любая идея, как достичь этого или ссылку, как она может работать, или официальное заявление о том, что оно не работает.

5
@viperbone привет, у вас есть полный образец кода решения? У меня была какая-то проблема, и я пытаюсь сделать это, это фрагменты
добавлено автор Gorets, источник
@viperbone привет, у вас есть полный образец кода решения? У меня была какая-то проблема, и я пытаюсь сделать это, это фрагменты
добавлено автор Gorets, источник
вы не можете помещать что-либо над панелью действий в ландшафтном режиме, я боролся с ней несколько недель, пока я, наконец, не сдался, и поставил свой собственный бар наверху, если вы в портрете - это поможет вам stackoverflow.com/questions/16002217/…
добавлено автор Lena Bru, источник
вы не можете помещать что-либо над панелью действий в ландшафтном режиме, я боролся с ней несколько недель, пока я, наконец, не сдался, и поставил свой собственный бар наверху, если вы в портрете - это поможет вам stackoverflow.com/questions/16002217/…
добавлено автор Lena Bru, источник
Да, вместо этого я использовал TabIndicator, который похож на обычный listview с viewpager, который довольно прост в реализации, но он не выглядит точно так же, как панель действий
добавлено автор Lena Bru, источник
Да, вместо этого я использовал TabIndicator, который похож на обычный listview с viewpager, который довольно прост в реализации, но он не выглядит точно так же, как панель действий
добавлено автор Lena Bru, источник
Спасибо за ответ. Кажется, ваше решение работает только в том случае, если включена поддержка TABS NavigationMode? Таким образом, вы не нашли другого решения и создали свою собственную панель заголовков и вообще не использовали панель действий?
добавлено автор Bruno Bieri, источник
Спасибо за ответ. Кажется, ваше решение работает только в том случае, если включена поддержка TABS NavigationMode? Таким образом, вы не нашли другого решения и создали свою собственную панель заголовков и вообще не использовали панель действий?
добавлено автор Bruno Bieri, источник
@Gorets Нет, извините, я не могу вам помочь в этом случае.
добавлено автор Bruno Bieri, источник

9 ответы

Вы можете использовать getRootView() для любого вида или getWindow (). GetDecorView() , чтобы получить PhoneDecorView . У него есть один ребенок - вертикальный LinearLayout .

Добавьте свой макет в качестве первого ребенка.

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

Во-вторых, это может сломаться на OEM-тематических устройствах.

В-третьих, как насчет планшета в ландшафте, у вас действительно будет такой огромный бар наверху?

В заключение, да, это возможно, но это ужасная идея. Не делай этого.

6
добавлено
Быть осторожен! Это верно для моей Galaxy S3 mini, но на моей Galaxy S4 был com.android.internal.widget.ActionBarOverlayLayout вместо LinearLayout. Лучшим решением для меня было вставить мой собственный LinearLayout между decorView и представлением для контента.
добавлено автор Vladyslav Savchenko, источник

Вы можете использовать getRootView() для любого вида или getWindow (). GetDecorView() , чтобы получить PhoneDecorView . У него есть один ребенок - вертикальный LinearLayout .

Добавьте свой макет в качестве первого ребенка.

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

Во-вторых, это может сломаться на OEM-тематических устройствах.

В-третьих, как насчет планшета в ландшафте, у вас действительно будет такой огромный бар наверху?

В заключение, да, это возможно, но это ужасная идея. Не делай этого.

6
добавлено
Быть осторожен! Это верно для моей Galaxy S3 mini, но на моей Galaxy S4 был com.android.internal.widget.ActionBarOverlayLayout вместо LinearLayout. Лучшим решением для меня было вставить мой собственный LinearLayout между decorView и представлением для контента.
добавлено автор Vladyslav Savchenko, источник
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.SherlockActivity;

public class MainActivity extends SherlockActivity {
private ActionBar bar;
@Override
protected void onCreate(Bundle savedInstanceState) {
    setTheme(R.style.Theme_Sherlock);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    bar = getSupportActionBar();
    LayoutInflater inflater =       (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View customView = (View)inflater.inflate(R.layout.custom_view, null); //<-- put your ad instead of this
    bar.setDisplayOptions(
            ActionBar.DISPLAY_SHOW_CUSTOM,
            ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_HOME
                    | ActionBar.DISPLAY_SHOW_TITLE);
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    bar.setCustomView(customView, new ActionBar.LayoutParams(
            ViewGroup.LayoutParams.MATCH_PARENT,
            ViewGroup.LayoutParams.MATCH_PARENT));
}

 @Override
    public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
        getSupportMenuInflater().inflate(R.menu.test_menu, menu);
        return super.onCreateOptionsMenu(menu);
    }
 }
0
добавлено
Вы хоть представляете, как он может работать со встроенным Android ActionBar?
добавлено автор Bruno Bieri, источник
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.SherlockActivity;

public class MainActivity extends SherlockActivity {
private ActionBar bar;
@Override
protected void onCreate(Bundle savedInstanceState) {
    setTheme(R.style.Theme_Sherlock);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    bar = getSupportActionBar();
    LayoutInflater inflater =       (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View customView = (View)inflater.inflate(R.layout.custom_view, null); //<-- put your ad instead of this
    bar.setDisplayOptions(
            ActionBar.DISPLAY_SHOW_CUSTOM,
            ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_HOME
                    | ActionBar.DISPLAY_SHOW_TITLE);
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    bar.setCustomView(customView, new ActionBar.LayoutParams(
            ViewGroup.LayoutParams.MATCH_PARENT,
            ViewGroup.LayoutParams.MATCH_PARENT));
}

 @Override
    public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
        getSupportMenuInflater().inflate(R.menu.test_menu, menu);
        return super.onCreateOptionsMenu(menu);
    }
 }
0
добавлено
Вы хоть представляете, как он может работать со встроенным Android ActionBar?
добавлено автор Bruno Bieri, источник

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

Это означает, что вы не можете контролировать, где он находится, и что находится над ним.

Ваш макет начинается ниже панели действий и заканчивается в нижней части экрана.

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

0
добавлено
Привет, спасибо, за ваш ответ. Я добавил изображение представления иерархии. Тем не менее, я думаю, это должно быть возможно.
добавлено автор Bruno Bieri, источник

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

Это означает, что вы не можете контролировать, где он находится, и что находится над ним.

Ваш макет начинается ниже панели действий и заканчивается в нижней части экрана.

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

0
добавлено
Привет, спасибо, за ваш ответ. Я добавил изображение представления иерархии. Тем не менее, я думаю, это должно быть возможно.
добавлено автор Bruno Bieri, источник

Вы говорите, что у вас есть ссылка на макет содержимого. можете ли вы получить его родительское представление? затем добавьте его в LinearLayout, затем добавьте свой вид в первую позицию.

http://developer.android.com/reference/android /view/View.html#getParent%28%29

0
добавлено

This hardly seems worth the bounty, but a previous question answers this: Getting admob above actionbarsherlock

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

Пользователь утверждает, что получил это для работы.

0
добавлено

This hardly seems worth the bounty, but a previous question answers this: Getting admob above actionbarsherlock

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

Пользователь утверждает, что получил это для работы.

0
добавлено
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

Android Developers
Android Developers
4 476 участник(ов)

Общаемся на темы, посвященным Android-разработке, SDK, Kotlin, Realm и т.д.

Android Architecture
Android Architecture
2 186 участник(ов)

Русскоязычный чат по архитектуре в андроид приложениях. Подробнее: http://telegra.ph/Android-Architecture-12-24

rus-speaking/android
rus-speaking/android
1 705 участник(ов)

Основной чат по Android разработке (вопрос-ответ). ПРАВИЛА: bit.ly/andr-rules. NEWS: bit.ly/AnrdResId ЧАТЫ: Основной: bit.ly/andr-main IDE, сборка, Git, сервисы: bit.ly/andr-tools Оффтоп: bit.ly/andr-offtop Конференции, события: bit.ly/andr-events Вакансии, найм: bit.ly/andr-job Архитектура: bit.ly/andr-patterns Rx: bit.ly/andr-rx Тестирование: bit.ly/andr-test Kotlin: bit.ly/andr-kotlin Хаmarin: bit.ly/andr-xamarin За мат, спам, агрессию, предложения о работе, оффтоп в этом канале - бан на сутки и более ☢☢☢

Android Dev Подкаст
Android Dev Подкаст
1 325 участник(ов)

Комната для обсуждения Android Dev подкаста apptractor.ru/AndroidDev/ Общее обсуждение Android: https://t.me/android_ru Остальные чаты про Android: http://t.me/devChats Наши новости https://t.me/androiddevpodcast_news

Android Guards
Android Guards
602 участник(ов)

Обсуждение любых вопросов касающихся безопасности Android. - Защита системы и приложений - Уязвимости и эксплойты - Вредоносное ПО - Копание в кишках системы и приложений (RE)

Android JOB
Android JOB
466 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению Android (full-time, part-time, remote и разовые подработки)

AndroidDev :: Разработка. It's Android time now!
AndroidDev :: Разработка. It's Android time now!
458 участник(ов)

It's Android time now! Чат разработчиков Android. Вакансии, резюме и информацию о митапах размещать можно. Публикацию скрытой и явной рекламы ваших каналов и сайтов после получения разрешения от @olegushakov

Aandroid Talks!
Aandroid Talks!
212 участник(ов)

Чат об общих вопросах по ОС Android. Чат для разработки под андроид - pro.android: https://t.me/joinchat/AAAAAEKIFKnmRT9cMebb9w

Android Rus
Android Rus
68 участник(ов)