Commit 0edab532 authored by 王雪伟's avatar 王雪伟

[提交人]:王雪伟

[提交简述] :小象省钱
[实现方案] :加入盲盒类型和会员支付页
parent 2935aad1
...@@ -82,6 +82,13 @@ public interface IVideoInfoApi { ...@@ -82,6 +82,13 @@ public interface IVideoInfoApi {
*/ */
@GET(NetConfig.User.URL_PAY_CONFIG) @GET(NetConfig.User.URL_PAY_CONFIG)
Observable<Response<MemberEntity>> getPayConfig(); Observable<Response<MemberEntity>> getPayConfig();
/**
* 获取频道列表
*
* @return
*/
@GET(NetConfig.User.URL_PAY_CONFIG)
Observable<Response<MemberEntity>> getPayConfig(@Query("payMode") String payMode);
/** /**
......
...@@ -211,6 +211,8 @@ interface RounterApi { ...@@ -211,6 +211,8 @@ interface RounterApi {
@RounterUri(Constant.scheme + "://member_order") @RounterUri(Constant.scheme + "://member_order")
fun getIntentMemberOrder(): Intent fun getIntentMemberOrder(): Intent
@RounterUri(Constant.scheme + "://open_member")
fun getIntentOpenMember(): Intent
@RounterUri(Constant.scheme + "://after_login") @RounterUri(Constant.scheme + "://after_login")
fun getIntentAfterLogin( fun getIntentAfterLogin(
......
...@@ -74,6 +74,17 @@ public class JumpUtils { ...@@ -74,6 +74,17 @@ public class JumpUtils {
} }
} }
//开会员
public static void OpenMember() {
try {
Intent intent = RounterBus.getRounter(RounterApi.class).getIntentOpenMember();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
AppContext.get().startActivity(intent);
} catch (Exception e) {
Utils.showToast(AppContext.get(), "该版本暂不支持,请更新版本!");
}
}
public static void AfterLoginJump(String boxid, String needprice, String type, String onePrice, String fivePrice, String newPeople, String page) { public static void AfterLoginJump(String boxid, String needprice, String type, String onePrice, String fivePrice, String newPeople, String page) {
try { try {
Intent intent = RounterBus.getRounter(RounterApi.class).getIntentAfterLogin(boxid, needprice, type, onePrice, fivePrice, newPeople, page); Intent intent = RounterBus.getRounter(RounterApi.class).getIntentAfterLogin(boxid, needprice, type, onePrice, fivePrice, newPeople, page);
...@@ -420,6 +431,7 @@ public class JumpUtils { ...@@ -420,6 +431,7 @@ public class JumpUtils {
Utils.showToast(AppContext.get(), "该版本暂不支持,请更新版本!"); Utils.showToast(AppContext.get(), "该版本暂不支持,请更新版本!");
} }
} }
public static void AbuoutUsJump() { public static void AbuoutUsJump() {
try { try {
Intent intent = RounterBus.getRounter(RounterApi.class).getIntentAboutUs(); Intent intent = RounterBus.getRounter(RounterApi.class).getIntentAboutUs();
......
...@@ -983,6 +983,32 @@ public class Utils { ...@@ -983,6 +983,32 @@ public class Utils {
return (hour<10?("0"+hour):hour) + ":" + (minutes<10?("0"+minutes):minutes) + ":" + (sencond<10?("0"+sencond):sencond); return (hour<10?("0"+hour):hour) + ":" + (minutes<10?("0"+minutes):minutes) + ":" + (sencond<10?("0"+sencond):sencond);
} }
public static String timeConversion2(int time) {
int hour = 0;
int minutes = 0;
int sencond = 0;
int temp = time % 3600;
if (time > 3600) {
hour = time / 3600;
if (temp != 0) {
if (temp > 60) {
minutes = temp / 60;
if (temp % 60 != 0) {
sencond = temp % 60;
}
} else {
sencond = temp;
}
}
} else {
minutes = time / 60;
if (time % 60 != 0) {
sencond = time % 60;
}
}
return (minutes<10?("0"+minutes):minutes) + ":" + (sencond<10?("0"+sencond):sencond);
}
public static boolean isShouldHideInput(View v, MotionEvent event) { public static boolean isShouldHideInput(View v, MotionEvent event) {
if (v != null && (v instanceof EditText)) { if (v != null && (v instanceof EditText)) {
int[] leftTop = {0, 0}; int[] leftTop = {0, 0};
......
...@@ -185,6 +185,18 @@ ...@@ -185,6 +185,18 @@
</intent-filter> </intent-filter>
</activity> </activity>
<activity android:name=".activity.OpenMemberActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data
android:host="open_member"
android:scheme="xxsq" />
</intent-filter>
</activity>
</application> </application>
......
package com.zxbw.modulemain.activity
import android.view.View
import com.zxbw.modulemain.R
import com.zxhl.cms.AppContext
import com.zxhl.cms.common.base.BaseActivity
import kotlinx.android.synthetic.main.activity_layout_open_member.*
/**
* @author (wangXuewei)
* @datetime 2022-05-30 14:12 GMT+8
* @detail :
*/
class OpenMemberActivity : BaseActivity() {
override fun before() {
super.before()
setStatusBarBackground(AppContext.get().resources.getColor(R.color.transparent))
}
override fun onClick(v: View?) {
}
override fun layoutID(): Int {
return R.layout.activity_layout_open_member
}
override fun init() {
id_img_open_vip.setOnClickListener {
}
}
}
\ No newline at end of file
package com.zxbw.modulemain.activity package com.zxbw.modulemain.activity
import android.content.Intent
import android.net.Uri
import android.os.Handler
import android.text.TextUtils
import android.util.Log
import android.view.View import android.view.View
import android.webkit.*
import androidx.recyclerview.widget.LinearLayoutManager
import com.zxbw.modulemain.R import com.zxbw.modulemain.R
import com.zxhl.cms.AppContext import com.zxhl.cms.AppContext
import com.zxhl.cms.common.Constant
import com.zxhl.cms.common.NetConfig
import com.zxhl.cms.common.base.BaseActivity import com.zxhl.cms.common.base.BaseActivity
import com.zxhl.cms.net.ApiClient
import com.zxhl.cms.net.RxSchedulers
import com.zxhl.cms.net.SettingPreference
import com.zxhl.cms.net.callback.BaseObserver
import com.zxhl.cms.net.model.box.AppInEntity import com.zxhl.cms.net.model.box.AppInEntity
import com.zxhl.cms.net.model.uc.PayResultEntity
import com.zxhl.cms.net.model.video.MemberEntity import com.zxhl.cms.net.model.video.MemberEntity
import com.zxhl.cms.pay.PayContract import com.zxhl.cms.pay.PayContract
import com.zxhl.cms.pay.PayPresenter import com.zxhl.cms.pay.PayPresenter
import com.zxhl.cms.pay.PaymentFunAdapter
import com.zxhl.cms.utils.*
import com.zxhl.cms.widget.LoadingDialog
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.functions.Consumer
import kotlinx.android.synthetic.main.activity_layout_member_order.*
import java.util.*
/** /**
* @author (wangXuewei) * @author (wangXuewei)
* @datetime 2022-05-30 14:12 GMT+8 * @datetime 2022-05-30 14:12 GMT+8
* @detail : * @detail :
*/ */
class OpenMemberOrderActivity : BaseActivity(),PayContract.View { class OpenMemberOrderActivity : BaseActivity(), PayContract.View {
private var mPresenter: PayContract.Presenter? = null
private var payResultObservable: Observable<PayResultEntity>? = null
private var mPayFunAdapter: PaymentFunAdapter? = null;
private var mLoading: LoadingDialog? = null
companion object {
const val ALI_PAY = 1 //支付宝支付类型
const val WECHAT_PAY = 2 //微信支付类型
const val MINI_PROGRAM = 11 //微信支付类型
const val MIN_PAY_PROGRAM = 13 //敏付
const val H5_PAY = 21 //h5支付
}
private var pay_type: Int? = 0
override fun before() { override fun before() {
super.before() super.before()
setStatusBarBackground(AppContext.get().resources.getColor(R.color.transparent)) setStatusBarBackground(AppContext.get().resources.getColor(R.color.transparent))
} }
override fun onClick(v: View?) { override fun onClick(v: View?) {
} }
...@@ -28,6 +65,106 @@ class OpenMemberOrderActivity : BaseActivity(),PayContract.View { ...@@ -28,6 +65,106 @@ class OpenMemberOrderActivity : BaseActivity(),PayContract.View {
} }
override fun init() { override fun init() {
mLoading = LoadingDialog.getLoadingDialog(
this,
getString(R.string.wait_ing),
false,
false
)
mPresenter = PayPresenter(this)
payResultObservable = RxBus.get().register(Constant.PAY_RESULT, PayResultEntity::class.java)
payResultObservable?.observeOn(AndroidSchedulers.mainThread())
?.subscribe(Consumer<PayResultEntity> { obj ->
MainLooper?.get()?.postDelayed(Runnable {
mHandler?.removeCallbacksAndMessages(null)
}, 1000)
Log.d("qqbs", "verifyPay:${obj.txt}")
//println("verifyPay payResultObservable------------------------------- order:${obj.txt}")
if (obj.isPaySuc) {
mPresenter?.verifyPay(obj.txt, obj.payType)
} else {
//支付宝支付
if (obj.payType == 1) {
if (obj.payStatus == "6001") {
EventUtils.onEvent("zfb_pay_cancel")
} else {
EventUtils.onEvent("zfb_pay_error", obj.payStatus + " msg:" + obj.txt)
}
} else {
EventUtils.onEvent("wx_pay_error", obj.txt)
}
showResultLoading(false)
}
}, Consumer<Throwable> { })
val userInfoData = SettingPreference.getUserInfoData()
if (userInfoData != null) {
id_tv_user_vip_phone.text = userInfoData.nickname
}
vipTime()
mPayFunAdapter = PaymentFunAdapter(
this
) { view, position, data ->
pay_type = data.type
mPayFunAdapter?.setPosition(position)
}
id_rcl_vip_payment_list.layoutManager = LinearLayoutManager(this)
id_rcl_vip_payment_list.adapter = mPayFunAdapter
id_tv_open_vip_btn_pay?.setOnClickListener {
gotoPay()
}
id_img_back?.setOnClickListener {
finish()
}
}
override fun data() {
super.data()
mPresenter?.appInfo()
getPayList()
}
private fun gotoPay() {
if (pay_type == 0) {
Utils.showToast(this, "请选择支付类型")
return
}
if (payData == null) {
Utils.showToast(this, "订单获取异常")
return
}
mLoading?.setLoading("请稍后")
mLoading?.show()
if (pay_type == ALI_PAY) {
mPresenter?.requestAliPay(
this,
payData?.goodsId ?: "",
pay_type.toString(),
"5"
)
} else if (pay_type == WECHAT_PAY) {
Log.e("MXL", "2微信原生支付")
mPresenter?.requestWechatPayOrder(
payData?.goodsId ?: "",
pay_type.toString()
)
} else if (pay_type == MINI_PROGRAM) {
Log.e("MXL", "2微信连连支付")
mPresenter?.requestWechatPayOrder(
payData?.goodsId ?: "",
pay_type.toString()
)
} else {
Log.e("MXL", "2支付宝敏支付")
mPresenter?.requestMiniProgrom(
payData?.goodsId ?: "",
pay_type.toString(),
"5"
)
}
} }
...@@ -36,19 +173,27 @@ class OpenMemberOrderActivity : BaseActivity(),PayContract.View { ...@@ -36,19 +173,27 @@ class OpenMemberOrderActivity : BaseActivity(),PayContract.View {
} }
override fun verifyOrderFail(errorMsg: String) { override fun verifyOrderFail(errorMsg: String) {
EventUtils.onEvent("pay_fail", errorMsg)
showResultLoading(false)
} }
override fun requestOrderSuc() { override fun requestOrderSuc() {
mLoading?.setLoading("正在支付")
} }
override fun requestH5OrderSuc(form: String) { override fun requestH5OrderSuc(form: String) {
if (form.isEmpty()) {
EventUtils.onEvent("h5_pay_error")
showResultLoading(false)
} else {
loadH5Pay(form)
}
} }
override fun verifyOrderSuc(orsder: String) { override fun verifyOrderSuc(orsder: String) {
EventUtils.onEvent("pay_suc")
showResultLoading(true)
finish()
} }
override fun setCanInvest(boolean: Boolean?) { override fun setCanInvest(boolean: Boolean?) {
...@@ -60,6 +205,173 @@ class OpenMemberOrderActivity : BaseActivity(),PayContract.View { ...@@ -60,6 +205,173 @@ class OpenMemberOrderActivity : BaseActivity(),PayContract.View {
} }
override fun setAppInfo(result: AppInEntity?) { override fun setAppInfo(result: AppInEntity?) {
if (result != null && !result.pay_config_v2.isNullOrEmpty()) {
mPayFunAdapter?.clear()
mPayFunAdapter?.appendToList(result.pay_config_v2)
for (i in result.pay_config_v2!!.indices) {
if (result?.pay_config_v2!![i].open == 1) {
pay_type = result?.pay_config_v2!![i].type
mPayFunAdapter?.setPosition(i)
break
}
}
}
}
private fun showResultLoading(isPaySuc: Boolean) {
if (isPaySuc) {
mLoading?.setResult(true, "支付成功", 1000)
} else {
mLoading?.setResult(false, "支付失败", 1000)
}
}
private var mHandler: Handler = Handler {
when (it.what) {
0 -> {
if (mLoading != null) {
mLoading?.setResult(false, "取消支付", 1000)
}
}
}
false
}
private var isPause = false
override fun onResume() {
super.onResume()
if (isPause) {
if (pay_type == MIN_PAY_PROGRAM || pay_type == H5_PAY) {
//如果是敏支付或者H5支付
mPresenter?.verifyPay(SettingPreference.getOutTradeNo(), pay_type!!)
} else {
mHandler?.sendEmptyMessageDelayed(0, 2000)
}
}
}
override fun onPause() {
super.onPause()
isPause = true
}
override fun onDestroy() {
super.onDestroy()
timer?.cancel()
timer = null
}
private fun loadH5Pay(form: String) {
val webSettings = id_member_pay_web_view.settings
//如果访问的页面中要与Javascript交互,则webview必须设置支持Javascript
webSettings.javaScriptEnabled = true
//设置自适应屏幕,两者合用
webSettings.useWideViewPort = true //将图片调整到适合webview的大小
webSettings.loadWithOverviewMode = true // 缩放至屏幕的大小
//其他细节操作
webSettings.cacheMode = WebSettings.LOAD_NO_CACHE //关闭webview中缓存
webSettings.allowFileAccess = true //设置可以访问文件
webSettings.javaScriptCanOpenWindowsAutomatically = true //支持通过JS打开新窗口
webSettings.loadsImagesAutomatically = true //支持自动加载图片
webSettings.defaultTextEncodingName = "utf-8" //设置编码格式
webSettings.domStorageEnabled = true
webSettings.allowFileAccessFromFileURLs = true;
webSettings.allowUniversalAccessFromFileURLs = true;
id_member_pay_web_view?.webViewClient = object : WebViewClient() {
override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
Log.e("WXW", "dURL" + url.toString())
if (url == null) return false
try {
if (url.startsWith("alipays://") //支付宝
) {
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
startActivity(intent)
return true
}
} catch (e: Exception) { //防止crash (如果手机上没有安装处理某个scheme开头的url的APP, 会导致crash)
EventUtils.onEvent("h5_open_zfb_error", e.toString())
showResultLoading(false)
return true //没有安装该app时,返回true,表示拦截自定义链接,但不跳转,避免弹出上面的错误页面
}
//处理http和https开头的url
view?.loadUrl(url)
return false
}
override fun onPageFinished(view: WebView?, url: String?) {
Log.e("WXW", "cURL" + url.toString())
Log.d("wxw", "EndTime" + System.currentTimeMillis())
super.onPageFinished(view, url)
if (url?.contains(NetConfig.H5.WEB_URL_H5_PAY) == true) {
id_member_pay_web_view?.loadUrl("javascript:loadPayHtml('$form')");
}
}
override fun onReceivedError(
view: WebView?,
request: WebResourceRequest?,
error: WebResourceError?
) {
super.onReceivedError(view, request, error)
EventUtils.onEvent("h5_pay_error1", error.toString())
showResultLoading(false)
}
override fun onReceivedHttpError(
view: WebView?,
request: WebResourceRequest?,
errorResponse: WebResourceResponse?
) {
super.onReceivedHttpError(view, request, errorResponse)
EventUtils.onEvent("h5_pay_error2", errorResponse.toString())
showResultLoading(false)
}
}
id_member_pay_web_view.loadUrl(NetConfig.H5.WEB_URL_H5_PAY)
}
var timer: Timer? = null
private fun vipTime() {
var timeCount = 15 * 60
// 创建计时器对象
timer = Timer()
// 创建计时器任务
var timerTask: TimerTask = object : TimerTask() {
override fun run() {
timeCount--;
runOnUiThread {
id_tv_vip_lock_time.text = Utils.timeConversion2(timeCount)
if (timeCount == 0) {
timer?.cancel()
//mDialog.dismiss()
}
}
}
}
// 添加任务,设定开始计时器时间,第2个参数为时间单位毫秒,如果是0,立即执行
timer?.schedule(timerTask, 0, 1000)
}
private var payData: MemberEntity.ProductDetail? = null;
private fun getPayList() {
ApiClient.videoInfoApi.getPayConfig("vip").compose(RxSchedulers.observableIO2Main())
.subscribe(object : BaseObserver<MemberEntity>() {
override fun onSuccess(result: MemberEntity?) {
if (!result?.goodsList.isNullOrEmpty()) {
if (result?.goodsList?.size!! >= 1) {
payData = result.goodsList!![0]
id_tv_vip_price.text = "${payData?.cash}元"
id_tv_vip_price2.text = payData?.cash
id_tv_vip_price3.text = "原价¥${payData?.originalPrice}"
}
}
}
override fun onFailure(e: Throwable?, code: String?, errorMsg: String?) {
}
})
} }
} }
\ No newline at end of file
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_below="@id/id_vip_order_detail_title_sys_bar_view" android:layout_below="@id/id_vip_order_detail_title_sys_bar_view"
android:layout_marginLeft="16dp"
android:src="@drawable/img_vip_fanhui_icon" /> android:src="@drawable/img_vip_fanhui_icon" />
<TextView <TextView
...@@ -59,7 +60,7 @@ ...@@ -59,7 +60,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="20dp" android:layout_marginStart="20dp"
android:layout_marginTop="26dp" android:layout_marginTop="26dp"
android:layout_marginRight="16dp" android:layout_marginEnd="16dp"
android:src="@drawable/img_vip_check_icon" /> android:src="@drawable/img_vip_check_icon" />
<TextView <TextView
...@@ -85,7 +86,7 @@ ...@@ -85,7 +86,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginRight="12dp" android:layout_marginRight="12dp"
android:text="15:00:00" android:text="15:00"
android:textColor="@color/color_333333" android:textColor="@color/color_333333"
android:textSize="16sp" android:textSize="16sp"
android:textStyle="bold" /> android:textStyle="bold" />
...@@ -117,9 +118,10 @@ ...@@ -117,9 +118,10 @@
android:textStyle="bold" /> android:textStyle="bold" />
<TextView <TextView
android:id="@+id/id_tv_vip_price"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="21元" android:text=""
android:textColor="@color/color_333333" android:textColor="@color/color_333333"
android:textSize="16sp" /> android:textSize="16sp" />
...@@ -228,12 +230,12 @@ ...@@ -228,12 +230,12 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="10dp" android:layout_marginTop="10dp"
android:layout_marginBottom="95dp"
android:background="@drawable/shape_white_r10" android:background="@drawable/shape_white_r10"
android:orientation="vertical" android:orientation="vertical"
android:paddingLeft="12dp" android:paddingLeft="12dp"
android:paddingTop="20dp" android:paddingTop="20dp"
android:paddingRight="12dp" android:paddingRight="12dp"
android:layout_marginBottom="95dp"
android:paddingBottom="8dp"> android:paddingBottom="8dp">
<LinearLayout <LinearLayout
...@@ -272,7 +274,6 @@ ...@@ -272,7 +274,6 @@
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="31dp"
android:layout_alignParentBottom="true" android:layout_alignParentBottom="true"
android:background="@drawable/img_vip_bottom_pay_btn_bg" android:background="@drawable/img_vip_bottom_pay_btn_bg"
android:orientation="horizontal"> android:orientation="horizontal">
...@@ -292,18 +293,20 @@ ...@@ -292,18 +293,20 @@
android:textSize="14sp" /> android:textSize="14sp" />
<TextView <TextView
android:id="@+id/id_tv_vip_price2"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginRight="13dp" android:layout_marginRight="13dp"
android:text="21" android:text=""
android:textColor="#FDDFA5" android:textColor="#FDDFA5"
android:textSize="18sp" android:textSize="18sp"
android:textStyle="bold" /> android:textStyle="bold" />
<TextView <TextView
android:id="@+id/id_tv_vip_price3"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="限时¥ 21" android:text="原价¥"
android:textColor="#FDDFA5" android:textColor="#FDDFA5"
android:textSize="10sp" /> android:textSize="10sp" />
...@@ -311,6 +314,7 @@ ...@@ -311,6 +314,7 @@
</LinearLayout> </LinearLayout>
<TextView <TextView
android:id="@+id/id_tv_open_vip_btn_pay"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="1" android:layout_weight="1"
...@@ -321,4 +325,10 @@ ...@@ -321,4 +325,10 @@
android:textStyle="bold" /> android:textStyle="bold" />
</LinearLayout> </LinearLayout>
<WebView
android:id="@+id/id_member_pay_web_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone" />
</RelativeLayout> </RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:id="@+id/id_img_open_vip"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:scaleType="fitXY"
android:src="@drawable/img_open_vip_top" />
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:scaleType="fitXY"
android:src="@drawable/img_open_vip_bottom" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</RelativeLayout>
...@@ -67,7 +67,7 @@ ...@@ -67,7 +67,7 @@
android:id="@+id/id_tv_box_discount_desc" android:id="@+id/id_tv_box_discount_desc"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="20dp" android:layout_height="20dp"
android:gravity="center_vertical" android:gravity="center"
android:text="已减10元幸运币" android:text="已减10元幸运币"
android:textColor="#437EEE" android:textColor="#437EEE"
android:textSize="12sp" /> android:textSize="12sp" />
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment