如何将AdMob放置在屏幕顶部(上图)Android操作栏?

时间:2013-06-23 06:41:30

标签: android android-layout android-actionbar admob

我尝试将AdMob广告放置在Android操作栏的屏幕顶部(上方)。 ActionBar AdMob above

  • 黄色= ActionBar
  • red = content
  • green = AdMob

我发现similar question是在屏幕底部放置一个广告,并显示操作栏。但到目前为止,我无法弄清楚如何将它放在屏幕的顶部。

我试过这种方式:

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”的id。在上面的代码中,我设法访问了FrameLayout“内容”,但我无法访问action_bar_container视图。因为它们位于相同的层次结构级别(我认为),所以应该可以以某种方式访问​​该ActionBar视图。

enter image description here

但它不起作用:

Without ActionBar displayed

任何想法如何实现它或链接如何工作或官方声明它不起作用。

5 个答案:

答案 0 :(得分:6)

您可以在任意视图上使用getRootView(),或getWindow().getDecorView()获取PhoneDecorView。它有一个孩子 - 垂直LinearLayout

将您的布局添加为第一个孩子。

请注意,这是一个糟糕的坏主意。从用户体验的角度来看,这是对所有设计指南的可怕打击。由于众多设计原因,操作栏必须位于顶部。

其次,这可能会破坏以OEM为主题的设备。

第三,在风景中平板电脑怎么样,你真的会在顶部有这样一个巨大的酒吧吗?

总之,是的,这是可能的,但这是一个可怕的想法。不要这样做。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

据我所知,一旦你选择使用ActionBar,它就会被添加到比你的布局更高的层次(UI层次结构)。

意味着您无法控制它的放置位置以及置于其上方的内容。

您的布局从操作栏下方开始,到屏幕底部结束。

在我看来,如果你确实找到了一种方法来做你想做的事,那将是非常不完整的。

答案 3 :(得分:0)

您说您有内容框架布局参考。你能得到它的父视图吗?将其转换为LinearLayout,然后在第一个位置添加您的视图。

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

答案 4 :(得分:0)

这似乎不值得赏金,但之前的一个问题回答了这个问题: Getting admob above actionbarsherlock

诀窍是从使用Google操作栏切换到actionbarsherlock库。无论如何,这对您的应用程序来说可能是一个好主意,因为它允许您支持较旧版本的android上的操作栏。

用户声称已经开始工作了。