如果您已使用付费墙编辑工具自定义了付费墙,则无需在移动应用代码中手动渲染即可将其展示给用户。此类付费墙已包含展示内容及展示方式的完整配置。
本指南仅适用于新版付费墙编辑工具付费墙,需要 SDK v3.0。不同版本的付费墙编辑工具设计的付费墙、远程配置付费墙以及观察者模式的付费墙展示方式各不相同。
如需获取下文使用的 viewConfiguration 对象,请参阅获取付费墙编辑工具付费墙及其配置。
要在设备屏幕上展示可视化付费墙,必须先进行配置。请调用 AdaptyUI.getPaywallView() 方法或直接创建 AdaptyPaywallView:
val paywallView = AdaptyUI.getPaywallView(
activity,
viewConfiguration,
products,
eventListener,
insets,
personalizedOfferResolver,
tagResolver,
timerResolver,
)
val paywallView =
AdaptyPaywallView(activity) // or retrieve it from xml
...
with(paywallView) {
showPaywall(
viewConfiguration,
products,
eventListener,
insets,
personalizedOfferResolver,
tagResolver,
timerResolver,
)
}
AdaptyPaywallView paywallView = AdaptyUI.getPaywallView(
activity,
viewConfiguration,
products,
eventListener,
insets,
personalizedOfferResolver,
tagResolver,
timerResolver
);
AdaptyPaywallView paywallView =
new AdaptyPaywallView(activity); //add to the view hierarchy if needed, or you receive it from xml
...
paywallView.showPaywall(viewConfiguration, products, eventListener, insets, personalizedOfferResolver, tagResolver, timerResolver);
<com.adapty.ui.AdaptyPaywallView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" />
视图成功创建后,即可将其添加到视图层级并在设备屏幕上展示。
如果您获取 AdaptyPaywallView 的方式不是通过调用 AdaptyUI.getPaywallView(),则还需要调用 .showPaywall() 方法。
要在设备屏幕上展示可视化付费墙,必须先进行配置。请使用以下可组合函数:
AdaptyPaywallScreen(
viewConfiguration,
products,
eventListener,
insets,
personalizedOfferResolver,
tagResolver,
timerResolver,
)
请求参数:
| 参数 | 是否必填 | 描述 |
|---|
| viewConfiguration | 必填 | 提供包含付费墙视觉详情的 AdaptyUI.LocalizedViewConfiguration 对象。使用 Adapty.getViewConfiguration(paywall) 方法加载。详情请参阅获取付费墙视觉配置主题。 |
| products | 可选 | 提供 AdaptyPaywallProduct 数组以优化产品在屏幕上的显示时机。若传入 null,AdaptyUI 将自动获取所需产品。 |
| eventListener | 可选 | 提供 AdaptyUiEventListener 以监听付费墙事件。建议扩展 AdaptyUiDefaultEventListener 以便使用。详情请参阅处理付费墙事件主题。 |
| insets | 可选 | Insets 是付费墙周围的空间,用于防止可点击元素被系统栏遮挡。 默认值:UNSPECIFIED,即 Adapty 会自动调整 insets,适合全面屏付费墙。 如果您的付费墙不是全面屏,可能需要设置自定义 insets。具体方法请参阅下方修改付费墙 insets 部分。 |
| personalizedOfferResolver | 可选 | 如需指示个性化定价(了解更多),请实现 AdaptyUiPersonalizedOfferResolver 并传入您自己的逻辑,将 AdaptyPaywallProduct 映射为 true(价格已个性化)或 false(未个性化)。 |
| tagResolver | 可选 | 使用 AdaptyUiTagResolver 解析付费墙文本中的自定义标签。该解析器接受标签参数并将其解析为对应字符串。详情请参阅付费墙编辑工具中的自定义标签主题。 |
| timerResolver | 可选 | 如需使用自定义计时器功能,请在此处传入解析器。 |
想了解 Adapty SDK 如何集成到移动应用中的真实示例?请查看我们的示例应用,其中展示了完整的配置过程,包括显示付费墙、完成购买以及其他基本功能。
修改付费墙 insets
Insets 是付费墙周围的空间,用于防止可点击元素被系统栏遮挡。默认情况下,Adapty 会自动调整 insets,适合全面屏付费墙。
如果您的付费墙不是全面屏,可能需要设置自定义 insets:
- 如果状态栏和导航栏均未与
AdaptyPaywallView 重叠,请使用 AdaptyPaywallInsets.NONE。
- 对于更复杂的场景,例如付费墙仅与顶部状态栏重叠而不与底部导航栏重叠,可以仅将
bottomInset 设置为 0,如下例所示:
import androidx.core.graphics.Insets
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
//create extension function
fun View.onReceiveSystemBarsInsets(action: (insets: Insets) -> Unit) {
ViewCompat.setOnApplyWindowInsetsListener(this) { _, insets ->
val systemBarInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars())
ViewCompat.setOnApplyWindowInsetsListener(this, null)
action(systemBarInsets)
insets
}
}
//and then use it with the view
paywallView.onReceiveSystemBarsInsets { insets ->
val paywallInsets = AdaptyPaywallInsets.vertical(insets.top, 0)
paywallView.showPaywall(
viewConfiguration,
products,
eventListener,
paywallInsets,
personalizedOfferResolver,
tagResolver,
timerResolver,
)
}
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
...
ViewCompat.setOnApplyWindowInsetsListener(paywallView, (view, insets) -> {
Insets systemBarInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars());
ViewCompat.setOnApplyWindowInsetsListener(paywallView, null);
AdaptyPaywallInsets paywallInsets =
AdaptyPaywallInsets.of(systemBarInsets.top, 0);
paywallView.showPaywall(paywall, products, viewConfiguration, paywallInsets, productTitleResolver);
return insets;
});
使用开发者自定义计时器
要在移动应用中使用开发者自定义计时器,请创建一个 timerResolver 对象——一个将自定义计时器与字符串值配对的字典或映射,字符串值将在付费墙渲染时替换相应计时器。示例如下:
import java.util.Calendar
import java.util.Date
import java.util.TimeZone
...
val customTimers = mapOf(
"CUSTOM_TIMER_NY" to Calendar.getInstance(TimeZone.getDefault()).apply { set(2025, 0, 1) }.time, // New Year 2025
)
val timerResolver = AdaptyUiTimerResolver { timerId ->
customTimers.getOrElse(timerId, { Date(System.currentTimeMillis() + 3600 * 1000L) /* in 1 hour */ } )
}
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
...
Map<String, Date> customTimers = new HashMap<>();
customTimers.put(
"CUSTOM_TIMER_NY",
new Calendar.Builder().setTimeZone(TimeZone.getDefault()).setDate(2025, 0, 1).build().getTime()
);
AdaptyUiTimerResolver timerResolver = new AdaptyUiTimerResolver() {
@NonNull
@Override
public Date timerEndAtDate(@NonNull String timerId) {
Date date = customTimers.get(timerId);
return date != null ? date : new Date(System.currentTimeMillis() + 3600 * 1000L); /* in 1 hour */
}
};
在此示例中,CUSTOM_TIMER_NY 是您在 Adapty 看板中设置的开发者自定义计时器的 Timer ID。timerResolver 确保您的应用动态更新计时器为正确的值——例如 13d 09h 03m 34s(根据计时器结束时间(如元旦)减去当前时间计算得出)。
要在移动应用中使用自定义标签,请创建一个 tagResolver 对象——一个将自定义标签与字符串值配对的字典或映射,字符串值将在付费墙渲染时替换相应标签。示例如下:
val customTags = mapOf("USERNAME" to "John")
val tagResolver = AdaptyUiTagResolver { tag -> customTags[tag] }
Map<String, String> customTags = new HashMap<>();
customTags.put("USERNAME", "John");
AdaptyUiTagResolver tagResolver = customTags::get;
在此示例中,USERNAME 是您在 Adapty 看板中以 <USERNAME/> 形式输入的自定义标签。tagResolver 确保您的应用将该自定义标签动态替换为指定值——例如 John。
建议在展示付费墙前创建并填充 tagResolver。准备好后,将其传递给用于展示付费墙的 AdaptyUI 方法。
修改付费墙加载指示器颜色
您可以通过以下方式覆盖加载指示器的默认颜色:
<style name="AppTheme" parent="android:Theme.Material.Light.NoActionBar">
<item name="adapty_progressIndicatorColor">@color/yourColor</item>
</style>