0

I am developing news app and I have implemented adview with databinding but it is giving following exception

java.lang.IllegalStateException: The ad size and ad unit ID must be set before loadAd is called.
     at com.google.android.gms.internal.ads.zzxv.zza(com.google.android.gms:play-services-ads-lite@@19.1.0:82)
     at com.google.android.gms.ads.BaseAdView.loadAd(com.google.android.gms:play-services-ads-lite@@19.1.0:15)
     at com.google.android.gms.ads.AdView.loadAd(com.google.android.gms:play-services-ads-lite@@19.1.0:20)
     at yodgorbek.komilov.musobaqayangiliklari.ui.TopHeadlinesFragment.initializeAds(TopHeadlinesFragment.kt:95)
     at yodgorbek.komilov.musobaqayangiliklari.ui.TopHeadlinesFragment.onViewCreated(TopHeadlinesFragment.kt:56)
     at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:322)
     at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1185)
     at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1354)
     at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1432)
     at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1495)
     at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:447)
     at androidx.fragment.app.FragmentManager.executeOps(FragmentManager.java:2167)
     at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1990)
     at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1945)
     at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1847)
     at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2621)
     at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2569)
     at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:247)
     at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:541)
     at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:201)
     at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1392)
     at android.app.Activity.performStart(Activity.java:7252)
     at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3000)
     at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:185)
     at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:170)
     at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:147)
     at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:73)
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1858)
     at android.os.Handler.dispatchMessage(Handler.java:106)
     at android.os.Looper.loop(Looper.java:201)
     at android.app.ActivityThread.main(ActivityThread.java:6820)
     at java.lang.reflect.Method.invoke(Native Method)
     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:922)

but I have tried following answers Ad Size and Ad unit id must be set before loadAd is called and this The ad size and ad unit ID must be set before loadAd when set programmatically and this one as well Include AdView with databinding and https://github.com/firebase/quickstart-android/blob/master/admob/app/src/main/java/com/google/samples/quickstart/admobexample/kotlin/MainActivity.kt from StackOverflow it did not solve my problem

below my XML file where I have implemented ad view

<data>

    <variable
        name="adId"
        type="String" />
</data>

<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:ads="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">



    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginBottom="56dp"
        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <ProgressBar
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/pb"
        android:gravity="center"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <com.google.android.gms.ads.AdView
        xmlns:ads="http://schemas.android.com/apk/res-auto"
        android:id="@+id/adView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        ads:adSize="BANNER"
        ads:adUnitId="@{adId}"
        ads:layout_constraintTop_toBottomOf="@+id/pb"
        ads:layout_constraintBottom_toBottomOf="@+id/pb"/>


</androidx.constraintlayout.widget.ConstraintLayout>

below my Fragment class

class TopHeadlinesFragment : Fragment() {

    private lateinit var binding: FragmentTopHeadlinesBinding


    private val viewModel by viewModel<MainViewModel>()


    private lateinit var topHeadlinesAdapter: TopHeadlinesAdapter



    //3
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding =
            DataBindingUtil.inflate(inflater, R.layout.fragment_top_headlines, container, false)
        binding.lifecycleOwner = this
        topHeadlinesAdapter = TopHeadlinesAdapter()
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        initViewModel()
        initializeAds()





    }

    private fun initViewModel() {
        viewModel.sportList.observe(this, Observer { result ->

            when (result) {
                is Results.Success -> {
                    val newList = result.data
                    if (newList != null) {
                        topHeadlinesAdapter.updateData(newList)
                    }
                    binding.recyclerView.adapter = topHeadlinesAdapter
                    topHeadlinesAdapter.notifyDataSetChanged()
                }
            }
        })

        viewModel.showLoading.observe(this, Observer { showLoading ->
            pb.visibility = if (showLoading) View.VISIBLE else View.GONE
        })

        viewModel.loadNews()
    }


    private fun initializeAds(){
        MobileAds.initialize(context)

       // adView.adSize = AdSize.BANNER
        binding.adId = "my unit id"
        val adRequest = AdRequest.Builder().build()
        binding.adView.loadAd(adRequest)
    }

}

I want to know where exactly I am making mistake I have tried all StackOverflow and even documentation sample it did solve my issue I have tried set unit id and size programmatically using kotlin and XML file as well it did not work at all any tips will be appreciated.

2 Answers2

1
 //Admob banner
        MobileAds.initialize(this, new OnInitializationCompleteListener()  {
            @Override
            public void onInitializationComplete(InitializationStatus initializationStatus) {
            }
        });

        mAdView = findViewById(R.id.adView);
        AdRequest adRequest = new AdRequest.Builder().build();
        mAdView.loadAd(adRequest);
        mAdView.setAdListener(new AdListener() {
            @Override
            public void onAdLoaded() {
                super.onAdLoaded();
                mAdView.setVisibility(View.VISIBLE);
            }

            @Override
            public void onAdFailedToLoad(int i) {
                super.onAdFailedToLoad(i);
                mAdView.setVisibility(View.GONE);
            }


        });

xml

<com.google.android.gms.ads.AdView
        android:id="@+id/adView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="30dp"
        android:visibility="gone"
        app:adSize="BANNER"
        app:adUnitId="@string/ad_unit_id_banner1" />

manifest

 <meta-data
                android:name="com.google.android.gms.ads.APPLICATION_ID"
                android:value="@string/app_id"/>
        <meta-data
            android:name="com.google.android.gms.ads.AD_MANAGER_APP"
            android:value="true" />
Eugene Sermyagin
  • 1,101
  • 2
  • 9
  • 15
0

You can write it like this:

val adRequest = AdRequest.Builder().build()
binding.adId = "my unit id"
binding.adView.loadAd(adRequest)
Dharman
  • 30,962
  • 25
  • 85
  • 135
Ravi
  • 140
  • 1
  • 12