Android: проблема с образцом Google Admob

Я пытаюсь создать пример приложения admob, в котором есть только самое необходимое. Я следовал инструкциям и даже скопировал большую часть кода с этого сайта: http://code.google.com/mobile/ads/docs/android/fundamentals.html, но приложение принудительно закрывает мой виртуальный диск и мое реальное устройство. Отладчик выдает «RuntimeException» в строке: layout.addView(adview). Я уверен, что есть простое решение для этого, но я не могу понять его. Я искал вокруг, но большая часть информации в Интернете предназначена для рекламы до Google, которая использовала другую процедуру.

Вот моя основная активность (моя единственная активность):

public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // Create the adView
    AdView adView = new AdView(this, AdSize.BANNER, "a14dc6ed8aead31");
    LinearLayout layout = (LinearLayout)findViewById(R.layout.main);
    layout.addView(adView); //RuntimeException at this line
    AdRequest request = new AdRequest();
    request.setTesting(true);
    adView.loadAd(request);
}

Вот мой вывод ошибки logcat:

05-22 17:49:24.534: ОШИБКА/AndroidRuntime(19619): Причина: java.lang.NullPointerException

05-22 17:49:24.534: ОШИБКА/AndroidRuntime(19619): в com.example.admobsample.MainActivity.onCreate(MainActivity.java:22)

05-22 17:49:24.534: ОШИБКА/AndroidRuntime(19619): в android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)

05-22 17:49:24.534: ОШИБКА/AndroidRuntime(19619): в android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2544)

05-22 17:49:24.534: ОШИБКА/AndroidRuntime(19619): ... еще 11

05-22 17:49:26.024: ОШИБКА/PackageInstallationReceiver(17825): удалить /data/local/tmp/com.example.admobsample.apk Ошибка!


person Cbas    schedule 22.05.2011    source источник
comment
Какая у тебя ошибка Logcat? Я уверен, что вам нужно установить параметры макета adView (его ширину и высоту);   -  person Blundell    schedule 23.05.2011
comment
Я добавил это выше. Где вы устанавливаете эти параметры?   -  person Cbas    schedule 23.05.2011
comment
Logcat говорит, что вы получаете NPE, что объясняется в ответе @tg.   -  person Blundell    schedule 23.05.2011


Ответы (2)


NPE происходит потому, что layout равно null, т. е. нет представления с идентификатором R.layout.main.

Интерпретация исходного примера

    // Lookup your LinearLayout assuming it’s been given
    // the attribute android:id="@+id/mainLayout"
    LinearLayout layout = (LinearLayout)findViewById(R.id.mainLayout);

вам нужно добавить атрибут android:id в ваш LinearLayout (идентификатор должен отличаться от R.id.main).

person Thilo-Alexander Ginkel    schedule 22.05.2011
comment
Хорошо, это заставило его работать. Спасибо... Баннер сначала не показывался, но примерно через минуту выскочил образец объявления. Проблема решена - person Cbas; 23.05.2011

Как только вы исправите ошибку NPE, вы можете получить еще одну ошибку.

Вы должны установить высоту и ширину макета, прежде чем добавлять его в представление.

AdView adView = new AdView(this, AdSize.BANNER, "a14dc6ed8aead31");
adView .setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
LinearLayout layout = (LinearLayout)findViewById(R.id.layoutMain);
layout.addView(adView);
person Blundell    schedule 23.05.2011
comment
setLayoutParams, кажется, ни на что не влияет - программа работает нормально с ним и без него, и рекламный баннер выглядит одинаково в обоих случаях. - person Cbas; 23.05.2011