我做了几次与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)进行静态引用。”在这种情况下我该怎么办?
答案 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和互联网上的其他一些人帮助我解决这个问题。这个问题困扰着我的时间超过了我的期望。