AdMobをアプリに統合していますが、Adsを正しく無効にする方法を知りたいです。ユーザーに無効にする機能を提供したい。インプレッションが間違っているため、AdMobで問題が発生することはありません。この方法は正しいですか、または何かを検討する必要がありますか?
AdView ads = (AdView) findViewById(R.id.ad);
ads.setEnabled(false);
レイアウトファイル(main.xmlなど)で:
<LinearLayout
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:id="@+id/adsContainer">
<com.admob.Android.ads.AdView
Android:id="@+id/admobAds"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
app:backgroundColor="#000000"
app:primaryTextColor="#FFFFFF"
app:secondaryTextColor="#CCCCCC">
</LinearLayout>
次に、コード内(たとえば、「if」ブロック内)
(LinearLayout) adscontainer = (LinearLayout) findViewById(R.id.adsContainer);
View admobAds = (View) findViewById(R.id.admobAds);
adscontainer.removeView(admobAds);
これにより、(アプリのライフサイクルの間)「永続的に」広告がlayouから削除されます。つまり、広告はリクエストされません。
また、ユーザーに広告を無効にする機能を提供したいと考えていました。そして、なぜあなたは人々がそのオプションにお金を払うことを期待すべきですか?
とにかく、私はこれを この記事 でどのようにしたかを概説しました。記事の詳細を説明しますが、関連する部分は次のとおりです。
広告をオフにするために使用するコード:
private void hideAd() {
final AdView adLayout = (AdView) findViewById(R.id.adView1);
runOnUiThread(new Runnable() {
@Override
public void run() {
adLayout.setEnabled(false);
adLayout.setVisibility(View.GONE);
}
});
}
そして、それらをオンに戻すため(誰かが寛大だと感じた場合)
private void showAd() {
final AdView adLayout = (AdView) findViewById(R.id.adView1);
runOnUiThread(new Runnable() {
@Override
public void run() {
adLayout.setEnabled(true);
adLayout.setVisibility(View.VISIBLE);
adLayout.loadAd(new AdRequest());
}
});
}
AdViewから派生した新しいクラスを作成します。
_package com.MyApp;
import Android.app.Activity;
import Android.content.Context;
import Android.util.AttributeSet;
import com.google.ads.AdRequest;
import com.google.ads.AdSize;
public class MyAdView extends com.google.ads.AdView {
public MyAdView(Activity activity, AdSize adSize, String adUnitId) {
super(activity, adSize, adUnitId);
if (MyApp.m_ads_enabled) {
AdRequest adRequest = new AdRequest();
loadAd(adRequest);
}
}
public MyAdView(Context context, AttributeSet attrs)
{
super(context, attrs);
if (MyApp.m_ads_enabled) {
AdRequest adRequest = new AdRequest();
loadAd(adRequest);
}
}
MyAdView(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
if (MyApp.m_ads_enabled) {
AdRequest adRequest = new AdRequest();
loadAd(adRequest);
}
}
_
xMLで、通常のMyAdView
ではなくAdView
を使用して広告を定義し、loadAdOnCreate
属性をfalse
に設定します。
_<com.MyApp.MyAdView Android:id="@+id/adView" Android:layout_width="wrap_content" Android:layout_height="wrap_content" ads:adUnitId="0" ads:adSize="BANNER" ads:loadAdOnCreate="false"/>
_
次に、setContentView()
を呼び出すときに_MyApp.m_ads_enabled
_の値に応じて、広告が無効または有効になります。
このアプローチには、広告が無効になっていると、広告がリクエストされないためデータ帯域幅が使用されないという利点があります。これは、制限付きまたはPAYGデータ契約の誰かにとって重要です。
残念ながら、setVisibility(View.GONE);
+ setEnabled(false)
コンボはすべてのAndroidバージョン/デバイスで普遍的に動作しません。いつ呼び出すかによって、ハングアップする可能性があります。空の画面(NPEなし、空白の画面)。
これまでのところ、私のために働く唯一の解決策は次のとおりです。
アクティビティの場合:
protected void removeAdView(int adViewId) {
View view = getWindow().getDecorView();
View adView = view.findViewById(adViewId);
if (adView != null) {
ViewGroup parent = (ViewGroup) adView.getParent();
parent.removeView(adView);
parent.invalidate();
}
}
フラグメントの場合:
protected void removeAdView(View topView, int adViewId) {
View adView = topView.findViewById(adViewId);
if (adView != null) {
ViewGroup parent = (ViewGroup) adView.getParent();
parent.removeView(adView);
parent.invalidate();
}
}
このソリューションは@Quartertoneの回答に基づいていますが、より普遍的に拡張されています(つまり、ViewGroup
だけでなく、すべてのLinearLayout
sで動作します)。これらのメソッドを基本のActivity/Fragmentクラスに配置するだけです。
ビューの可視性を[〜#〜] gone [〜#〜]に設定するだけで十分です。
Logcatの出力を読むと、"I/Ads:広告は表示されません。広告を更新していません。"が出力されます。
安全のために、必要なものをすべて提供します。
if (mAdView != null) {
mAdView.setEnabled(false);
mAdView.setVisibility(View.GONE);
ViewGroup parent = (ViewGroup) mAdView.getParent();
if (parent != null) parent.removeView(mAdView);
mAdView.removeAllViews();
mAdView.destroy();
}
このようなAds
というクラスを作成します
`public class Ads {public static boolean Show(AdView mAdView){
_ if(mAdView != null){
AdRequest adRequest = new AdRequest.Builder().build();
mAdView.loadAd(adRequest);
return true;
}
return false;
}
public static void Remove(AdView mAdView,ViewGroup parent){
root.removeView(mAdView);
}
public static void Remove(AdView mAdView,RelativeLayout mLayout){
mLayout.removeView(mAdView);
}
public static void Remove(AdView mAdView, LinearLayout mLayout){
mLayout.removeView(mAdView);
}
}
_
Ads.Remove(AdView, parent);
を使用してAdViewを削除するクラスにインポートします。 Ads.Remove("the add view itself", the ViewGroup or layout where it is");
Adviewを削除した後にレイアウトがリフローするかどうかはわかりません。そうでない場合は、同一の(欠落している広告を除く)レイアウトを作成できます。 OnCreateで、適切なレイアウトを選択します。次に、ユーザーが選択を行った後に構成変更がトリガーされることを確認する必要があります(選択画面からの復帰など、選択方法に応じて既に発生する可能性があります)。
setVisibility(VIEW.GONE);レイアウトからアドビューを削除します。
レイアウトから完全に削除する余地があるかもしれませんが、私はそれをする必要はありませんでした。