Error displaying Admob banner in Fragment - java

I'm familiar with implementing Admobs within my app, however im struggling with changing my code from Activities to Fragments.
I'm getting a NullPointerException. I believe using getView() may be causing my issue.
Admob code: Fragment
//CREATE BANNER ADD
private void createAdmobBanner()
{
// Create an ad.
adView = (com.google.android.gms.ads.AdView) getView()
.findViewById(R.id.adView);
AdRequest adRequest = new AdRequest.Builder()
// Add a test device to show Test Ads
.addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
// .addTestDevice("B3827F13FB335337F4CA0F350B78A866")
.build();
// Load ads into Banner Ads
adView.loadAd(adRequest);
}
XML Admob Layout
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:ads="http://schemas.android.com/apk/res-auto"
android:id="#+id/adViewHolder"
android:layout_width="fill_parent"
android:layout_height="#dimen/ad_bottom_height"
android:layout_marginTop="1dp"
android:gravity="center_vertical"
android:orientation="horizontal" >
<com.google.android.gms.ads.AdView
android:id="#+id/adView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
ads:adSize="SMART_BANNER"
ads:adUnitId="ca-app-pub-xxxx/xxxx"
/>
</LinearLayout>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="#dimen/bottom_bar_height"
android:orientation="horizontal" >
<Button
android:id="#+id/button1"
android:text="Refresh Scores"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:textSize="11dp"
android:layout_weight="1"
/>
Note: I use ...include layout="#layout/admob_ad" /> in my fragment layout xml.
Code Error:
09-24 22:04:02.429: E/AndroidRuntime(5375): java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.gms.ads.AdView.loadAd(com.google.android.gms.ads.AdRequest)' on a null object reference
09-24 22:04:02.429: E/AndroidRuntime(5375): at info.androidhive.slidingmenu.ChampionsFragment.createAdmobBanner(ChampionsFragment.java:391)

I faced Similar issue, when i checked closely in resourse file
There were two resourse file for my activity:
\res\layout\activity_main_lauch.xml
\res\layout-v21\activity_main_lauch.xml
I was modifing single file, hence it was throwing error. when i apply the change in both files it started working.

Related

How to show a snakbar with Lottie animation in start from a recycler view adapter

I am making a chat app and I want to add a feature like telegram to copy links ,phone numbers and etc.. from long clicking on an auto link.I used this library to add long click listeners on a auto link.I implemented it successfully.But when I do this, i want to show a Lottie animation in the start like this but on long click of a link.
I tried many answer but I get an exception.I already made the layout for custom snakbar.It is given below
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="56dp"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_margin="#dimen/_3sdp"
android:backgroundTint="#color/snakbar_background"
app:cardCornerRadius="#dimen/_4sdp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical">
<com.airbnb.lottie.LottieAnimationView
android:id="#+id/lottieSnakbar"
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_marginStart="#dimen/_5sdp"
android:layout_marginEnd="#dimen/_10sdp"
app:lottie_rawRes="#drawable/copy"
app:lottie_autoPlay="true"
app:lottie_loop="false"/>
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="Text copied to clipboard"
android:gravity="center_vertical"
android:theme="?snackbarTextViewStyle"
tools:ignore="HardcodedText" />
</LinearLayout>
</androidx.cardview.widget.CardView>
Now how can I achieve this?
You can use an interface in the adapter. And receive and show snakbar from activity
You could use localBroadcast and broadcast a local signal from the adapter and let the other Activity(probably receiver) handle snakbar.
AdapterClass{
LocalBroadcastManager localBroadcastManager = null;
void sendB(parms){
if(localBroadcastManager != null){
localBroadcastManager.sendBroadcast(Intent("NOTIFICATION_RECEIVER"))
}
onCreateViewHolder(){
localBroadcastManager = LocalBroadcastManager.getInstance(applicationContext)
}
onBindViewHolder(){
if(someCondition){
sendB(parms);
}
}
then receive it from an activity then call snakBar

BottomAppBar raises while using soft keyboard

I'm trying to hide BottomAppBar behind keyboard but when I change focus to another EditText the part of BottomAppBar start to appear like in photo . Also I have already tried change windowSoftInputMode but I really need adjustPan.
<com.google.android.material.bottomappbar.BottomAppBar
android:id="#+id/bottom_appbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:layout_gravity="bottom"
app:backgroundTint="#color/colorAccent"
app:fabCradleMargin="#dimen/fab_margin"
app:fabCradleRoundedCornerRadius="#dimen/fab_corner_radius"
app:hideOnScroll="false"
app:layout_scrollFlags="scroll|enterAlways"
android:transitionName="bottom_appbar"
style="#style/Widget.MaterialComponents.BottomAppBar" />
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="#+id/bottom_fab"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:clickable="true"
app:tint="#color/colorPrimary"
android:tint="#color/colorPrimary"
app:backgroundTint="#color/floatButtonColor"
app:rippleColor="#color/colorAccent"
app:layout_anchor="#id/bottom_appbar"/>
try adding this to your <activity> tag in the manifest
android:windowSoftInputMode="adjustPan|stateHidden"

Android app always show app name in toolbar

I want to show a specific text in my app toolbar but it also always shows the name of the app too. How can I get rid of the app name and only the text of the TextView?
<android.support.design.widget.AppBarLayout
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:theme="#style/AppTheme.AppBarOverlay"
android:fitsSystemWindows="true" >
<android.support.v7.widget.Toolbar
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?attr/actionBarSize"
app:popupTheme="#style/AppTheme.PopupOverlay"
android:fitsSystemWindows="true" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="left"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="The title I want to show"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true" />
</android.support.v7.widget.Toolbar>
</android.support.design.widget.AppBarLayout>
Add label to activity declaration in AndroidManifest.xml file.
<activity
....
android:label="Name of Your Screen"
....
</activity>
For static activity name, set android:label="Activity Name" attribute for each activity in AndroidManifest.xml
...
<activity
...
android:label="Activity Name">
...
</activity>
...
For dynamic activity name, you can use the following:
getActionBar().setTitle("Activity Name");
To provide compatibility across all the android versions, use:
getSupportActionBar().setTitle("Activity Name");
But if you want to completely get rid of the title bar, you can extend Activity instead of AppCompatActivity or you can hide the action bar:
ActionBar actionBar = getSupportActionBar();
actionBar.hide();
you just write this line in your activity getSupportActionBar().setDisplayShowTitleEnabled(false);
and it will set the visibility of the app name to invisible
Use
<activity
android:label="blah-blah" />
to set it in the manifest file.
Or in the code toolbar.setTitle("blah-blah");
If you set your Toolbar like ActionBar then you can call actionBar.setTitle("blah-blah");.
From the modification of the accepted answer, this actually resolved my issue.
All you need to do is to leave the "label name" text as blank in your manifest as example below
...
<activity
...
android:label=" ">
...
</activity>
...
this will actually enable only your textview text in your toolbar widget to show, it works very fine for me

Custom Facebook Share-Button, Android App

So I want to implement a custom Facebook share button into my Android app, but thus far I've only managed to use the native one, which I imported into my .xml file and made use of in my Java activity for that specific page.
My code looks like this (in .xml);
<com.facebook.share.widget.ShareButton
android:id="#+id/share_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="Share"
android:layout_centerHorizontal="true"/>
And in my .java, outside onCreate();
private ShareButton shareButton;
ShareLinkContent content = new ShareLinkContent.Builder()
.setContentUrl(Uri.parse("https://developers.facebook.com"))
.setContentTitle("MyTitle")
.build();
Inside onCreate();
shareButton = (ShareButton)findViewById(R.id.share_btn);
shareButton.setShareContent(content);
How would I go about making use of a custom button that I've imported into XML? Using .setShareContent obviously doesn't work if it's not an instance of ShareButton. Thanks in advance!
I have found a solution. It's clear that facebook share will work on its own button click event. So you will have to explicitly call the View.performclick() method.
Here is how i have done this:
In my layout
<com.facebook.share.widget.ShareButton
android:id="#+id/share_btn_fb"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone"
android:contentDescription="#string/share" />
<LinearLayout
android:id="#+id/share_btn"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="4"
android:orientation="horizontal"
android:gravity="center_vertical">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:src="#drawable/google_share" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="#string/share_google"
android:textColor="#color/green_color"
android:layout_marginLeft="5dp"
android:textSize="18sp" />
</LinearLayout>
Inside activity get refrences of these views.
ShareButton shareButton = (ShareButton) layout.findViewById(R.id.share_btn_fb);
LinearLayout shareFB = (LinearLayout) layout.findViewById(R.id.share_btn);
LinearLayout shareGoogle = (LinearLayout) layout.findViewById(R.id.share_google);
shareGoogle.setOnClickListener(this);
shareFB.setOnClickListener(this);
Inside onClick()
case R.id.share_btn :
shareButton.performClick();
break;
case R.id.share_btn_fb :
ShareLinkContent content = new ShareLinkContent.Builder()
.setContentTitle("Content title")
.setContentDescription("App descr")
.setContentUrl(Uri.parse("some url"))
.build();
shareButton.setShareContent(content);
break;
Basically shareButton.performClick(); is doing the trick.

Admob won't work

I try to implement Admob in the Goceng project. Since Admob changed, I can't really follow the documentation of this project.
My error is
05-04 12:51:21.959: W/Ads(9017): There was a problem getting an ad response. ErrorCode: 1
Many other people bought this project too, so I think the code is written well, I did not changed anything.
For testing I use:
AdRequest adRequest = new AdRequest.Builder().addTestDevice("XXX").build();
ads.loadAd(adRequest);
Admob id looks like
<string name="admob_id">ca-app-pub-xxxxxxxxxxxxxxxx/xxxxxxxxxx</string>
I just created an App in Admob and an advertisement block where I have this ID from.
Can anyone tell me my mistake?
Meta-data etc. in manifest is there, as I mentioned it is a finished project which works for many people
Code:
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ctx = this;
setContentView(R.layout.activity_home);
// Declare object of Utils class;
utils = new Utils(this);
// connect view objects and xml ids
adView = (AdView)this.findViewById(R.id.adView);
// add the fragment to the 'fragment_container' FrameLayout
getSupportFragmentManager().beginTransaction()
.add(R.id.frame_content, fragObjList).commit();
// load ads
Ads.loadAds(adView);
}
activity_home.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:ads="http://schemas.android.com/apk/res-auto"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#android:color/darker_gray">
<FrameLayout
android:id="#+id/frame_content"
android:layout_above="#+id/adView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<com.google.android.gms.ads.AdView
android:id="#+id/adView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
ads:adUnitId="#string/admob_id"
ads:adSize="SMART_BANNER"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"/>
</RelativeLayout>

Categories