Hoe plaats je AdMob bovenaan het scherm (hierboven) Android Actionbar?

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

  • geel = ActionBar
  • rood = inhoud
  • groen = AdMob

Een soortgelijke vraag Ik heb geconstateerd dat ik een advertentie onder aan een scherm moet plaatsen met Actionbar opdagen. Maar tot nu toe kon ik niet achterhalen hoe ik het boven aan het scherm moest plaatsen.

Ik probeerde het op deze manier:

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);
}

Hieronder ziet u een deel van de hiërarchie-viewer van mijn app. De weergave "id/main" is mijn hoofdlay-out. Zoals je op de afbeelding kunt zien, heeft de ActionBar een id met de naam "id/action_bar_container". In mijn code hierboven slaagde ik erin om de "content" van FrameLayout te benaderen, maar ik kreeg geen toegang tot de view action_bar_container. Omdat ze zich op hetzelfde hiërarchieniveau bevinden (denk ik), zou het op de een of andere manier mogelijk moeten zijn om toegang te krijgen tot die ActionBar-weergave.

enter image description here

Maar het werkte niet:

Without ActionBar displayed

Enig idee hoe dat te bereiken of een link hoe het zou kunnen werken of een officiële verklaring dat het niet werkt.

5
@viperbone hoi, heb je een volledige voorbeeldcode van de oplossing? Ik had het probleem en probeer dit te doen is fragmenten
toegevoegd de auteur Gorets, de bron
@viperbone hoi, heb je een volledige voorbeeldcode van de oplossing? Ik had het probleem en probeer dit te doen is fragmenten
toegevoegd de auteur Gorets, de bron
je kunt niets boven de actiebalk plaatsen in de liggende modus, ik heb er weken mee gestreten, totdat ik het eindelijk opgaf, en mijn eigen balk bovenaan plaatste, als je in portret bent - dit zal je helpen stackoverflow.com/questions/16002217/…
toegevoegd de auteur Lena Bru, de bron
je kunt niets boven de actiebalk plaatsen in de liggende modus, ik heb er weken mee gestreten, totdat ik het eindelijk opgaf, en mijn eigen balk bovenaan plaatste, als je in portret bent - dit zal je helpen stackoverflow.com/questions/16002217/…
toegevoegd de auteur Lena Bru, de bron
Ja, ik gebruikte in plaats daarvan TabIndicator, wat lijkt op een normale lijstweergave met een viewer, die vrij eenvoudig te implementeren was, maar die er niet precies hetzelfde uitziet als de actiebalk
toegevoegd de auteur Lena Bru, de bron
Ja, ik gebruikte in plaats daarvan TabIndicator, wat lijkt op een normale lijstweergave met een viewer, die vrij eenvoudig te implementeren was, maar die er niet precies hetzelfde uitziet als de actiebalk
toegevoegd de auteur Lena Bru, de bron
Dankje voor het antwoord. Het lijkt erop dat uw oplossing alleen werkt als NavigationMode TABS is ingeschakeld? Dus je hebt geen andere oplossing gevonden en je hebt je eigen titelbalk gemaakt en helemaal geen actiebalk gebruikt?
toegevoegd de auteur Bruno Bieri, de bron
Dankje voor het antwoord. Het lijkt erop dat uw oplossing alleen werkt als NavigationMode TABS is ingeschakeld? Dus je hebt geen andere oplossing gevonden en je hebt je eigen titelbalk gemaakt en helemaal geen actiebalk gebruikt?
toegevoegd de auteur Bruno Bieri, de bron
@Gorets Nee, sorry ik kan u in dat geval niet helpen.
toegevoegd de auteur Bruno Bieri, de bron

9 antwoord

U kunt getRootView() gebruiken in elke weergave of getWindow (). GetDecorView() om de PhoneDecorView te verkrijgen. Het heeft één kind - een verticale LinearLayout .

Voeg uw lay-out daar toe als het eerste kind.

Merk op dat dit een slecht, slecht idee is. Vanuit het oogpunt van gebruikerservaring is dit een gruwelijke aanval op alle ontwerprichtlijnen. De actiebalk moet bovenaan staan ​​om tal van ontwerpredenen.

Ten tweede kan dit breken op apparaten met een OEM-thema.

Ten derde, hoe zit het met tablets in het landschap, heb je echt zo'n enorme bar aan de top?

Tot slot, ja, het is mogelijk, maar het is een vreselijk idee. Doe het niet.

6
toegevoegd
Doe voorzichtig! Dat is goed voor mijn Galaxy S3 mini, maar op mijn Galaxy S4 was com.android.internal.widget.ActionBarOverlayLayout in plaats van LinearLayout. Betere oplossing voor mij was om mijn eigen LinearLayout tussen decorView in te voegen en te bekijken voor inhoud.
toegevoegd de auteur Vladyslav Savchenko, de bron

U kunt getRootView() gebruiken in elke weergave of getWindow (). GetDecorView() om de PhoneDecorView te verkrijgen. Het heeft één kind - een verticale LinearLayout .

Voeg uw lay-out daar toe als het eerste kind.

Merk op dat dit een slecht, slecht idee is. Vanuit het oogpunt van gebruikerservaring is dit een gruwelijke aanval op alle ontwerprichtlijnen. De actiebalk moet bovenaan staan ​​om tal van ontwerpredenen.

Ten tweede kan dit breken op apparaten met een OEM-thema.

Ten derde, hoe zit het met tablets in het landschap, heb je echt zo'n enorme bar aan de top?

Tot slot, ja, het is mogelijk, maar het is een vreselijk idee. Doe het niet.

6
toegevoegd
Doe voorzichtig! Dat is goed voor mijn Galaxy S3 mini, maar op mijn Galaxy S4 was com.android.internal.widget.ActionBarOverlayLayout in plaats van LinearLayout. Betere oplossing voor mij was om mijn eigen LinearLayout tussen decorView in te voegen en te bekijken voor inhoud.
toegevoegd de auteur Vladyslav Savchenko, de bron
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
toegevoegd
Heb je enig idee hoe het zou kunnen werken met de ingebouwde Android ActionBar?
toegevoegd de auteur Bruno Bieri, de bron
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
toegevoegd
Heb je enig idee hoe het zou kunnen werken met de ingebouwde Android ActionBar?
toegevoegd de auteur Bruno Bieri, de bron

Voor zover ik weet, wordt het, als je ervoor kiest om met een ActionBar te werken, toegevoegd op een hoger niveau (van de UI-hiërarchie) dan je lay-out.

Dit betekent dat je geen controle hebt over waar het is geplaatst en wat erboven is geplaatst.

Je layout begint onder de actiebalk en eindigt onderaan het scherm.

Naar mijn mening zal het erg fragmentarisch zijn als je een manier vindt om te doen wat je wilt.

0
toegevoegd
Hallo dors, bedankt voor je reactie. Ik heb een afbeelding van de hiërarchische weergave toegevoegd. Toch denk ik dat het mogelijk moet zijn om het te doen.
toegevoegd de auteur Bruno Bieri, de bron

Voor zover ik weet, wordt het, als je ervoor kiest om met een ActionBar te werken, toegevoegd op een hoger niveau (van de UI-hiërarchie) dan je lay-out.

Dit betekent dat je geen controle hebt over waar het is geplaatst en wat erboven is geplaatst.

Je layout begint onder de actiebalk en eindigt onderaan het scherm.

Naar mijn mening zal het erg fragmentarisch zijn als je een manier vindt om te doen wat je wilt.

0
toegevoegd
Hallo dors, bedankt voor je reactie. Ik heb een afbeelding van de hiërarchische weergave toegevoegd. Toch denk ik dat het mogelijk moet zijn om het te doen.
toegevoegd de auteur Bruno Bieri, de bron

U zegt dat u de verwijzing naar de inhoudskaderopmaak hebt. kun je de bovenliggende weergave krijgen? cast het naar LinearLayout en voeg vervolgens je weergave toe op de eerste positie.

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

0
toegevoegd

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

De truc is om over te schakelen van het gebruik van de google-actionbar naar actionbarsherlock-bibliotheek. Dit is sowieso een goed idee voor je app, omdat je hiermee de actiebalk op oudere builds van Android kunt ondersteunen.

De gebruiker beweert dat hij daarmee aan de slag is gegaan.

0
toegevoegd

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

De truc is om over te schakelen van het gebruik van de google-actionbar naar actionbarsherlock-bibliotheek. Dit is sowieso een goed idee voor je app, omdat je hiermee de actiebalk op oudere builds van Android kunt ondersteunen.

De gebruiker beweert dat hij daarmee aan de slag is gegaan.

0
toegevoegd