如何将AdMob放置在Android ActionBar顶部(上方)?

5
我想在Android Actionbar的顶部(上方)放置一个AdMob广告。 ActionBar AdMob above
  • 黄色 = ActionBar
  • 红色 = 内容
  • 绿色 = AdMob
我找到了一个类似的问题,是将广告放置在显示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”的ID。在上面的代码中,我设法访问FrameLayout“content”,但我无法访问action_bar_container视图。因为它们在同一层次结构级别上(我想),所以应该可以以某种方式访问ActionBar视图。

enter image description here

但它没有起作用:

Without ActionBar displayed

有什么想法如何实现这一点,或者一个链接说明它如何工作,或者一个官方声明说它不起作用。

在横屏模式下,您无法将任何内容放置在操作栏之上。我曾经为此苦苦挣扎了数周,最终放弃了,并在顶部放置了自己的工具栏。如果您处于纵向模式,则可以参考此链接:http://stackoverflow.com/questions/16002217/actionbarsherlock-landscape-mode - Lena Bru
谢谢你的回答。看起来你的解决方案只适用于启用了导航模式TABS的情况下?所以你没有找到其他解决方案,而是创建了自己的标题栏,并且完全没有使用操作栏? - Bruno Bieri
我使用了TabIndicator,它类似于一个带有ViewPager的普通ListView,实现起来相当容易,但它看起来并不完全像ActionBar。 - Lena Bru
@viperbone 你好,你有完整的示例解决方案代码吗?我遇到了一些问题,尝试以片段方式完成。 - Gorets
@Gorets 不好意思,我无法在这种情况下帮助你。 - Bruno Bieri
5个回答

6
你可以在任何视图中使用getRootView()getWindow().getDecorView()来获取PhoneDecorView。它只有一个子元素-一个垂直的LinearLayout
将你的布局添加为第一个子元素。
请注意,这是一个非常不好的想法。从用户体验的角度来看,这是对所有设计指南的可怕打击。行动栏必须在顶部,有多种设计原因。
其次,在OEM主题的设备上可能无法运行。
第三,对于横向的平板电脑,你真的会在顶部放置如此巨大的条吗?
总之,是可能的,但这是一个可怕的想法。不要这样做。

小心!这适用于我的Galaxy S3 mini,但在我的Galaxy S4上是com.android.internal.widget.ActionBarOverlayLayout而不是LinearLayout。对我来说更好的解决方案是在decorView和view之间插入自己的LinearLayout以用于内容。 - Vladyslav Savchenko

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

1
你有没有想过如何使用内置的Android ActionBar? - Bruno Bieri

0
据我所知,一旦您选择使用ActionBar,它就会添加在比您的布局更高的级别(UI层次结构)中。
这意味着您无法控制它的位置以及放置在其上方的内容。
您的布局从操作栏下方开始,并在屏幕底部结束。
依我之见,如果您找到了实现所需的方法,它将是非常零散的。

嗨Dors,谢谢您的回复。我添加了一个层次结构视图的图片。我仍然认为这是可能的。 - Bruno Bieri

0

0
这似乎不值得奖励,但之前的问题已经回答了这个问题:Getting admob above actionbarsherlock 诀窍是从使用Google ActionBar转换到ActionBarSherlock库。对于您的应用程序来说,这很可能是一个好主意,因为它允许您在旧版本的Android上支持ActionBar。
用户声称已经使其工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接