尝试将AdMob添加到LinearLayout控件时Android应用程序崩溃

时间:2014-04-16 05:41:24

标签: android xml android-layout admob android-linearlayout

我做了几次与AdMob相关的搜索导致Android应用崩溃,因为我的应用程序一直在崩溃。到目前为止,我没有取得任何成功。在进行研究之后,我能够将问题缩小到相当程度,所以现在我正在寻求帮助才能解决这个问题。

以下是我正在使用的相关代码:

MainActivity.java:

public class MainActivity extends ActionBarActivity{    

private AdView adView;
private static final String AD_UNIT_ID = "AD_ID";

@Override protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction().add(R.id.container, new PlaceholderFragment()).commit();
        }

        adView = new AdView(this);
        adView.setAdSize(AdSize.BANNER);
        adView.setAdUnitId(AD_UNIT_ID);

        LinearLayout layout = (LinearLayout) findViewById(R.id.linearLayout);
        layout.addView(adView); 
    }
}

这应该相对简单,对吧?现在,根据LogCat,错误发生在layout.addView(adView);行上。这就是让我感到困惑的地方;我的应用程序中有两个主要活动的布局文件。它在MainActivity.java中引用的布局文件是activity_main.xml,其中实际上没有布局。供参考:

activity_main.xml中:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.fongsoft.appname.MainActivity"
    tools:ignore="MergeRootFrame"
    xmlns:ads="http://schemas.android.com/apk/res-auto" >

</FrameLayout>

活动的实际布局存储在名为fragment_main.xml的文件中,包括我正在尝试引用的LinearLayout。所以看起来我的问题是我似乎无法找到LinearLayout控件,因为我正在查找错误的文件。有办法解决这个问题吗?

如果我需要发布任何其他代码或重新发送任何内容,请告知我们。

另外,作为旁注:MainActivity.java中的其他地方,我似乎能够引用fragment_main.xml中LinearLayout中的控件。举个例子:

public void refreshButtons(){
    Button button1=(Button)findViewById(R.id.button1);
}

在这种情况下,我可以在LinearLayout内引用和操作控件,但是添加到控件中时遇到了问题,这对我没有意义。

logcat的:

 Caused by: java.lang.NullPointerException
     at com.fongsoft.appname.MainActivity.onCreate(MainActivity.java:64)
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)

修改:可以在http://pastebin.com/KhAPgU3r找到完整的LogCat。

编辑#2:在添加@Ken的建议后,这是我当前代码的样子:

public class MainActivity extends ActionBarActivity{
// Class constructor stuff.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction().add(R.id.container, new PlaceholderFragment()).commit();
    }
}

// ...

public static class PlaceholderFragment extends Fragment{
    private AdView adView;
    private static final String AD_UNIT_ID = "AD_D";


    public PlaceholderFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main, container, false);
        return rootView;

        adView = new AdView(getActivity());
        adView.setAdSize(AdSize.BANNER);
        adView.setAdUnitId(AD_UNIT_ID);
        LinearLayout layout = (LinearLayout) findViewById(R.id.linearLayout);
        layout.addView(adView);
    }   
}

// ...
}

LinearLayout layout = (LinearLayout) findViewById(R.id.linearLayout);给出了一个错误,指出“无法从类型Activity中对非静态方法findViewById(int)进行静态引用。”在这种情况下我该怎么办?

1 个答案:

答案 0 :(得分:0)

经过更多的研究,我今天找到了一个可以与之合作的解决方案。

fragment_main.xml文件中,我有一个传统的AdView控件声明,所以我没有通过代码创建控件。

PlaceholderFragment课程中,我将onCreateView函数修改为如下所示:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_main, container, false);

    AdView adView = (AdView)rootView.findViewById(R.id.adView);
    AdRequest adRequest = new AdRequest.Builder()
        .addTestDevice("TEST_DEVICE")
        .build();
    adView.loadAd(adRequest);

    return rootView;
}

当我使用AdView adView = (AdView)rootView.findViewById(R.id.adView);时,问题在行rootView中得到解决,这基本上允许我访问fragment_main的内容。

感谢Ken和互联网上的其他一些人帮助我解决这个问题。这个问题困扰着我的时间超过了我的期望。