привет Я знаю, это немного старый и, возможно, на самом деле не такой же, как у меня было, но это может помочь вам.
Я пытался внедрить плагин Google DFP в компоненте RN на Android. Я почти все пробовал, и это не сработало. В конце я узнал, что объявление появляется только тогда, когда я устанавливаю высоту представления. Когда представление установлено на точную ширину и высоту, как и объявление, мой плагин работал как шарм. Проблема теперь в том, что я не хочу устанавливать жесткость по высоте и ширине, потому что иногда будет запрос, но показ объявления не будет показан. Возможно, у вас нет сетевого подключения, или не все ваши каналы заполнены баннерами. Поэтому я придумал, как установить размер AdView на 0, а на собственной стороне Java я присоединяю слушателя к методу onAdLoaded. На стороне JS вам также нужен прослушиватель, который вызывается при загрузке Ad и в этом JS-слушателе вы можете установить высоту плагина на нужный размер.
Я знаю, что это не самое лучшее решение, но в моем случае это сработало и до тех пор, пока у кого-то нет другого решения, и совместное решение со мной, я рад, что мой путь работал. Ниже мой код плагина:
NativeAdView.java
package com.YOURPACKAGE.ch.CustomModules;
import android.graphics.Color;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.View;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.modules.core.DeviceEventManagerModule;
import com.facebook.react.uimanager.SimpleViewManager;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.uimanager.annotations.ReactProp;
import com.facebook.react.uimanager.events.RCTEventEmitter;
import com.google.android.gms.ads.AdListener;
import com.google.android.gms.ads.AdSize;
import com.google.android.gms.ads.doubleclick.PublisherAdRequest;
import com.google.android.gms.ads.doubleclick.PublisherAdView;
public class NativeAdView extends SimpleViewManager<View> {
public static final String REACT_CLASS = "NativeAdView";
private PublisherAdView adView;
private ThemedReactContext mContext = null;
@Override
public String getName() {
return REACT_CLASS;
}
@Override
public View createViewInstance(final ThemedReactContext context) {
mContext = context;
adView = new PublisherAdView(context);
adView.setAdListener(new AdListener() {
public void onAdLoaded() {
WritableMap eventData = Arguments.createMap();
ReactContext reactContext = (ReactContext) context;
reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
.emit("YouCustomEventName", eventData);
}
});
return adView;
}
@ReactProp(name = "adUnitId")
public void setAdUnitId(View view, @Nullable String adUnitId) {
PublisherAdRequest adRequest = new PublisherAdRequest.Builder().build();
AdSize customAdSize = new AdSize(300, 250);
adView.setAdUnitId(adUnitId);
adView.setAdSizes(customAdSize);
adView.loadAd(adRequest);
}
public void onAdFailedToLoad(int errorCode) {
}
}
AdView.android.js
'use strict';
import React, { PropTypes } from 'react';
import {
requireNativeComponent,
View,
Text,
DeviceEventEmitter,
Dimensions,
LayoutAnimation
} from 'react-native';
let params = {
name: 'NativeAdView',
propTypes: {
...View.propTypes,
...Text.propTypes,
adUnitId: PropTypes.string
},
};
let NativeAdView = requireNativeComponent('NativeAdView', params);
let window = Dimensions.get('window');
class AdView extends React.Component {
constructor() {
super();
this.state = {
adHeight: 0,
adWidth: 0
};
}
componentWillMount() {
let self = this;
this._adListener = DeviceEventEmitter.addListener('YouCustomEventName', function(e) {
console.log(e);
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);
let adSize = JSON.parse(self.props.row.params.format);
self.setState({
adHeight: adSize[1],
adWidth: adSize[0]
});
});
}
componentWillUnmount() {
this._adListener.remove();
}
render() {
if(this.props.row.params) {
let adSize = JSON.parse(this.props.row.params.format);
let margin;
let height;
let width;
let adWidth;
let adHeight;
let adText;
if(this.state.adWidth > 0 && this.state.adHeight > 0) {
margin = 30;
height = this.state.adHeight + 60;
width = window.width;
adHeight = this.state.adHeight;
adWidth = this.state.adWidth;
adText = (
<View style={{marginLeft: adWidth-45}}>
<Text style={{color: 'lightgray', fontSize: 10}}>Anzeige</Text>
</View>
);
} else {
margin = 0;
height = 0;
width = 0;
adHeight = 0;
adWidth = 0;
}
return(
<View style={{justifyContent: 'center', alignItems: 'center', height: height, width: width, marginTop: margin}}>
{adText}
<NativeAdView
style={{height: adHeight, width: adWidth, marginLeft: margin, marginRight: margin, marginBottom: margin}}
adUnitId={this.props.row.params.name} />
</View>
);
} else {
return <View />;
}
}
}
module.exports = AdView;
Может быть кто-то другой, лучшее решение для этого. Это должно помочь любому, кто так же отчаянн, как и я, когда я это пробовал :)
Я думаю, нам нужно будет увидеть, что вы тоже реагируете на собственный код, поскольку он несет ответственность за отображение. Удостоверьтесь, что эта функция возвращает ожидаемый, действительно, сначала, конечно, –
добавил свой код для ответа, спасибо –
Можете ли вы также показать RCTAdmob и подтвердить его получение необходимых данных? –