货主地址新增以及编辑

This commit is contained in:
lijia 2024-10-31 15:22:17 +08:00
parent 9642fe44f0
commit 9ab96216c3
10 changed files with 421 additions and 48 deletions

View File

@ -10,6 +10,7 @@ object AppConfig {
const val BUGLY_APP_ID = "a5b894cef7"
const val TIME = "DA_HE_TIME"
const val ID = "DA_HE_ID"
const val BEAN = "DA_HE_BEAN"
const val IS_ADD = "DA_HE_IS_ADD"
const val CAPTAIN_ID = "CAPTAIN_ID"
const val PWD = "DA_HE_PHONE"

View File

@ -6,27 +6,72 @@ package com.dhsd.glowner.bean
* @constructor
*/
data class PostAddressBean(
val addressDetail: String,
val addressType: String,
val area: String,
val areaCode: String,
val city: String,
val cityCode: String,
val companyCode: String,
val companyName: String,
val contactNumber: String,
val contactPerson: String,
val idCard: Any,
val idDefault: String,
val isDeleted: String,
val latitude: String,
val longitude: String,
val province: String,
val provinceCode: String,
val sortValue: String,
val tagContent: String,
val userType: String
)
var province: String = "",
var city: String = "",
var area: String = "",
var areaCode: String = "",
var latitude: String = "",
var longitude: String = "",
var addressDetail: String = ""
) {
var addressType: String = ""
var cityCode: String = ""
var companyCode: String = ""
var companyName: String = ""
var contactNumber: String = ""
var contactPerson: String = ""
var idCard: String = ""
var idDefault: String = ""
var isDeleted: String = ""
var provinceCode: String = ""
var sortValue: String = ""
var tagContent: String = ""
var userType: String = ""
var addressId: String = ""
constructor(
province: String,
city: String,
area: String,
areaCode: String,
latitude: String,
longitude: String,
addressDetail: String,
addressType: String,
cityCode: String,
companyCode: String,
companyName: String,
contactNumber: String,
contactPerson: String,
idCard: String,
idDefault: String,
isDeleted: String,
provinceCode: String,
sortValue: String,
tagContent: String,
userType: String,
addressId: String
) : this(province, city, area, areaCode, latitude, longitude, addressDetail) {
this.addressType = addressType
this.cityCode = cityCode
this.companyCode = companyCode
this.companyName = companyName
this.contactNumber = contactNumber
this.contactPerson = contactPerson
this.idCard = idCard
this.idDefault = idDefault
this.isDeleted = isDeleted
this.provinceCode = provinceCode
this.sortValue = sortValue
this.tagContent = tagContent
this.userType = userType
this.addressId = addressId
}
}
data class Texfff(val name: String, val age: Int) {
constructor(name: String, age: Int, id: String) : this(name, age) {}
}
data class AddressBean(
val addressDetail: String,

View File

@ -11,6 +11,7 @@ import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.POST
import retrofit2.http.PUT
import retrofit2.http.Path
import retrofit2.http.Query
@ -101,6 +102,28 @@ interface Api {
@POST(BASE_URL+"devApi/business/shipper/common/address")
fun postAddress(@Body bean: PostAddressBean): Observable<CommonResponseBean<Any>>
/**
* 获取地址详情
* @param addressId String
* @return Observable<CommonResponseBean<PostAddressBean>>
*/
@GET(BASE_URL+"devApi/business/shipper/common/address/{addressId}")
fun getAddressDetail(@Path("addressId") addressId:String) : Observable<CommonResponseBean<PostAddressBean>>
/**
* 修改货主常用地址
* @param bean PostAddressBean
* @return Observable<CommonResponseBean<Any>>
*/
@PUT(BASE_URL+"devApi/business/shipper/common/address")
fun updateAddress(@Body bean: PostAddressBean): Observable<CommonResponseBean<Any>>
/**
* 获取地址列表
* @return Observable<CommonResponseBean<OrderListBean<AddressBean>>>
*/
@GET(BASE_URL+"devApi/business/shipper/common/address/list")
fun getAddressList(): Observable<CommonResponseBean<OrderListBean<AddressBean>>>
}

View File

@ -1,25 +1,39 @@
package com.dhsd.glowner.ui.address
import BaseObserver
import DataManager
import RxHttpCallBack
import android.app.Activity
import android.content.Intent
import android.graphics.Color
import android.os.Bundle
import android.view.View
import android.widget.LinearLayout
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import androidx.core.widget.addTextChangedListener
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.dahe.gldriver.base.AppConfig
import com.dahe.glex.bean.WayBillBean
import com.dahe.mylibrary.base.BaseActivity
import com.dahe.mylibrary.net.CommonResponseBean
import com.dahe.mylibrary.recycleviewswipe.RecycleViewDivider
import com.dahe.mylibrary.utils.ActivityUtils
import com.dahe.mylibrary.utils.ConvertUtils
import com.dahe.mylibrary.utils.PickerUtils
import com.dahe.mylibrary.utils.ToastUtils
import com.dahe.mylibrary.weight.SwitchView
import com.dhsd.glowner.R
import com.dhsd.glowner.adapter.SendGoodsAdapter
import com.dhsd.glowner.bean.PostAddressBean
import com.dhsd.glowner.databinding.ActivityAddressEditBinding
import com.dhsd.glowner.ui.mine.activity.ChoiceCarActivity
import com.dhsd.glowner.utils.OnLimitClickHelper
import com.dhsd.glowner.utils.OnLimitClickListener
import com.google.gson.Gson
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.schedulers.Schedulers
/**
* @ClassName AddresEditActivity
@ -29,14 +43,51 @@ import com.dhsd.glowner.utils.OnLimitClickListener
*/
class AddressEditOrAddActivity : BaseActivity<ActivityAddressEditBinding>(),
OnLimitClickListener {
private var isAdd:Boolean = true
private lateinit var postAddressBean: PostAddressBean
private var addressId: String = ""
private val launcher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == AppCompatActivity.RESULT_OK) {
result.data?.extras?.let {
val postBean = it.getString(AppConfig.BEAN)
if (postBean != null) {
val inAddressBean = Gson().fromJson(postBean, PostAddressBean::class.java)
val inAreaCode = inAddressBean.areaCode
inAddressBean.run {
provinceCode = inAreaCode.subSequence(0, 3).toString().plus("000")
cityCode = inAreaCode.subSequence(0, 4).toString().plus("00")
}
if (addressId.isEmpty()){
postAddressBean = inAddressBean
}else{
postAddressBean?.run {
addressDetail = inAddressBean.addressDetail
areaCode = inAddressBean.areaCode
area = inAddressBean.area
city = inAddressBean.city
province = inAddressBean.province
contactPerson = inAddressBean.contactPerson
contactNumber = inAddressBean.contactNumber
idCard = inAddressBean.idCard
}
}
initViewByData(postAddressBean)
}
}
}
}
override fun initView(savedInstanceState: Bundle?) {
setStatusBarColor(R.color.white)
setTitleBar("地址信息", { finish() }, true, "地图选点") {
ActivityUtils.startActivity(mContext,ChoiceAddressByMapActivity::class.java)
launcher.launch(Intent(mContext, ChoiceAddressByMapActivity::class.java))
}
addressId = intent.extras?.getString(AppConfig.ID, "").toString()
isAdd = intent.extras?.getBoolean(AppConfig.IS_ADD,true) == true
var datas = mutableListOf<WayBillBean>(
WayBillBean(),
@ -44,7 +95,7 @@ class AddressEditOrAddActivity : BaseActivity<ActivityAddressEditBinding>(),
WayBillBean()
)
binding.recycler.run {
layoutManager = LinearLayoutManager(mContext,RecyclerView.VERTICAL,false)
layoutManager = LinearLayoutManager(mContext, RecyclerView.VERTICAL, false)
addItemDecoration(
RecycleViewDivider(
LinearLayout.VERTICAL,
@ -58,7 +109,12 @@ class AddressEditOrAddActivity : BaseActivity<ActivityAddressEditBinding>(),
binding.run {
tvSSQ.setOnClickListener(OnLimitClickHelper(this@AddressEditOrAddActivity))
tvClear.setOnClickListener { etAddressDetail.setText("") }
tvClear.setOnClickListener {
etAddressDetail.setText("")
if (::postAddressBean.isInitialized && postAddressBean.addressDetail.isNotEmpty()) {
postAddressBean.addressDetail = ""
}
}
btnOk.setOnClickListener(OnLimitClickHelper(this@AddressEditOrAddActivity))
etAddressDetail.addTextChangedListener { text ->
@ -67,6 +123,11 @@ class AddressEditOrAddActivity : BaseActivity<ActivityAddressEditBinding>(),
// val inputTips = Inputtips(this, inputquery)
// }
}
mySwitch.setOnStateChangedListener2 {
changeAddressType(it)
}
}
@ -76,17 +137,124 @@ class AddressEditOrAddActivity : BaseActivity<ActivityAddressEditBinding>(),
super.onClick(view)
when (view?.id) {
R.id.tvSSQ -> {
PickerUtils.getInstance().showAddress(this
PickerUtils.getInstance().showAddress(
this
) { province, city, county ->
binding.tvSSQ.text = """${province.name}-${city.name}-${county.name}"""
}
}
R.id.btnOk->{
R.id.btnOk -> {
submit()
}
}
}
override fun initDate() {
if (addressId.isNotEmpty()) {
DataManager.getInstance().getAddressDetail(addressId)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(BaseObserver(mContext, object : RxHttpCallBack<PostAddressBean>() {
override fun onSuccess(t: CommonResponseBean<PostAddressBean>) {
super.onSuccess(t)
initViewByData(t.data)
}
}))
}
}
/**
* 新增或编辑地址信息
*
*/
private fun submit() {
if (!::postAddressBean.isInitialized || postAddressBean.province.isEmpty()) {
showToast("请选择省市区")
return
}
if (postAddressBean.addressDetail.isEmpty()) {
showToast("请输入详细地址")
return
}
if (binding.etName.text.isEmpty() || binding.etPhone.text.isEmpty() || binding.etCom.text.isEmpty() || binding.etComNum.text.isEmpty()) {
showToast("请完善联系人信息")
return
}
postAddressBean.run {
binding.run {
contactPerson = etName.text.toString()
contactNumber = etPhone.text.toString()
userType = if (mySwitch.isOpened) "1" else "0"
companyName = etCom.text.toString()
companyCode = etComNum.text.toString()
}
}
if (addressId.isNotEmpty()) {
DataManager.getInstance().updateAddress(postAddressBean)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(BaseObserver(mContext, object : RxHttpCallBack<Any>() {
override fun onSuccess(t: CommonResponseBean<Any>) {
super.onSuccess(t)
showToast(t.msg)
setResult(Activity.RESULT_OK)
finish()
}
}))
} else {
DataManager.getInstance().postAddress(postAddressBean)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(BaseObserver(mContext, object : RxHttpCallBack<Any>() {
override fun onSuccess(t: CommonResponseBean<Any>) {
super.onSuccess(t)
showToast(t.msg)
setResult(Activity.RESULT_OK)
finish()
}
}))
}
}
private fun changeAddressType(isCom: Boolean) {
if (isCom) {
binding.run {
etCom.hint = "公司名称"
etComNum.hint = "社会统一代码"
}
} else {
binding.run {
etCom.hint = "货主名称"
etComNum.hint = "身份证号"
}
}
}
/**
* 渲染页面
* @param data PostAddressBean
*/
private fun initViewByData(data: PostAddressBean) {
postAddressBean = data
binding.run {
binding.run {
tvSSQ.text =
"""${data.province}-${data.city}-${data.area}"""
etAddressDetail.setText(data.addressDetail)
etName.setText(data.contactPerson)
etPhone.setText(data.contactNumber)
etCom.setText(data.companyName)
etComNum.setText(data.companyCode)
mySwitch.isOpened = data.userType == "1"
}
}
}
}

View File

@ -3,15 +3,19 @@ package com.dhsd.glowner.ui.address
import BaseObserver
import DataManager
import RxHttpCallBack
import android.content.Intent
import android.graphics.Color
import android.os.Bundle
import android.view.View
import android.widget.LinearLayout
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.dahe.gldriver.base.AppConfig
import com.dahe.glex.bean.OrderListBean
import com.dahe.mylibrary.base.BaseActivity
import com.dahe.mylibrary.callback.RefreshCallBack
import com.dahe.mylibrary.net.CommonResponseBean
import com.dahe.mylibrary.recycleviewswipe.RecycleViewDivider
import com.dahe.mylibrary.utils.ActivityUtils
@ -20,6 +24,7 @@ import com.dhsd.glowner.R
import com.dhsd.glowner.adapter.AddressAdapter
import com.dhsd.glowner.bean.AddressBean
import com.dhsd.glowner.databinding.ActivityAddressListBinding
import com.dhsd.glowner.ui.mine.activity.ChoiceCarActivity
import com.dhsd.glowner.utils.OnLimitClickHelper
import com.dhsd.glowner.utils.OnLimitClickListener
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
@ -32,13 +37,21 @@ import io.reactivex.rxjava3.schedulers.Schedulers
* @Description 地址列表
*/
class AddressListActivity : BaseActivity<ActivityAddressListBinding>(),
OnLimitClickListener {
OnLimitClickListener , RefreshCallBack {
private val launcher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == AppCompatActivity.RESULT_OK) {
initDate()
}
}
lateinit var adapter: AddressAdapter
override fun initView(savedInstanceState: Bundle?) {
setStatusBarColor(R.color.white)
setTitleBar("地址", true)
binding.run {
setRefresh(smartRefresh, this@AddressListActivity)
adapter = recycler.run {
layoutManager = LinearLayoutManager(mContext, RecyclerView.VERTICAL, false)
addItemDecoration(
@ -59,6 +72,14 @@ class AddressListActivity : BaseActivity<ActivityAddressListBinding>(),
// adapter.getItem(position)?.isSelect = true
notifyDataSetChanged()
}
addOnItemChildClickListener(R.id.tvEdit){ adapter,_, position ->
val addressBean = adapter.items[position]
launcher.launch(Intent(mContext, AddressEditOrAddActivity::class.java).apply {
putExtras(Bundle().apply { putString(AppConfig.ID, addressBean.addressId) })
})
}
}
btnOk.setOnClickListener(OnLimitClickHelper(this@AddressListActivity))
}
@ -70,7 +91,7 @@ class AddressListActivity : BaseActivity<ActivityAddressListBinding>(),
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(BaseObserver(mContext,
object : RxHttpCallBack<OrderListBean<AddressBean>>() {
object : RxHttpCallBack<OrderListBean<AddressBean>>(binding.smartRefresh) {
override fun onSuccess(t: CommonResponseBean<OrderListBean<AddressBean>>) {
super.onSuccess(t)
initList(t.data.rows)
@ -82,9 +103,10 @@ class AddressListActivity : BaseActivity<ActivityAddressListBinding>(),
super.onClick(view)
when (view?.id) {
R.id.btnOk -> {
ActivityUtils.startActivity(mContext,AddressEditOrAddActivity::class.java,Bundle().apply {
putBoolean(AppConfig.IS_ADD,true)
})
launcher.launch(Intent(mContext, AddressEditOrAddActivity::class.java))
// ActivityUtils.startActivity(mContext,AddressEditOrAddActivity::class.java,Bundle().apply {
// putBoolean(AppConfig.IS_ADD,true)
// })
}
}
}
@ -101,4 +123,8 @@ class AddressListActivity : BaseActivity<ActivityAddressListBinding>(),
}
}
}
override fun getRefreshDate(stat: Int, page: Int, count: Int) {
initDate()
}
}

View File

@ -1,6 +1,8 @@
package com.dhsd.glowner.ui.address
import android.content.Intent
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.core.widget.addTextChangedListener
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
@ -19,12 +21,15 @@ import com.amap.api.services.geocoder.RegeocodeResult
import com.amap.api.services.help.Inputtips
import com.amap.api.services.help.Inputtips.InputtipsListener
import com.amap.api.services.help.InputtipsQuery
import com.dahe.gldriver.base.AppConfig
import com.dahe.mylibrary.base.BaseActivity
import com.dhsd.glowner.R
import com.dhsd.glowner.adapter.ChoiceAddressAdapter
import com.dhsd.glowner.bean.PostAddressBean
import com.dhsd.glowner.callback.OnMyGeocodeSearchListener
import com.dhsd.glowner.databinding.ActivityChoiceAddressByMapBinding
import com.dhsd.glowner.utils.GDLocationUtils
import com.google.gson.Gson
/**
* @ClassName ChoiceAddressByMapActivity
@ -49,6 +54,44 @@ class ChoiceAddressByMapActivity : BaseActivity<ActivityChoiceAddressByMapBindin
adapter as ChoiceAddressAdapter
}.apply {
isStateViewEnable = true
setOnItemClickListener { adapter, _, position ->
val tip = adapter.getItem(position)
if (tip != null) {
println(tip.toString())
GDLocationUtils.instance.getAddressByLatLng(
mContext,
tip.point,
object : OnMyGeocodeSearchListener() {
override fun onRegeocodeSearched(
result: RegeocodeResult?,
rCode: Int
) {
super.onRegeocodeSearched(result, rCode)
result?.let {
val postAddressBean = PostAddressBean(
it.regeocodeAddress.province,
it.regeocodeAddress.city,
it.regeocodeAddress.district,
it.regeocodeAddress.adCode,
it.regeocodeQuery.point.latitude.toString(),
it.regeocodeQuery.point.longitude.toString(),
tip.district + tip.address//保持详细地址一致
)
setResult(AppCompatActivity.RESULT_OK, Intent().apply {
putExtras(Bundle().apply {
putSerializable(
AppConfig.BEAN,
Gson().toJson(postAddressBean)
)
})
})
finish()
}
}
})
}
}
}
etInput.addTextChangedListener {

View File

@ -89,7 +89,7 @@ class GDLocationUtils private constructor() {
var geocoderSearch = GeocodeSearch(ctx)
geocoderSearch.setOnGeocodeSearchListener(listener)
val query = RegeocodeQuery(
latLng, 1000f,
latLng, 200f,
GeocodeSearch.AMAP
) // 第一个参数表示一个Latlng第二参数表示范围多少米第三个参数表示是火系坐标系还是GPS原生坐标系

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
@ -133,6 +134,8 @@
android:layout_weight="1"
android:background="@drawable/shape_gray_5"
android:hint="姓名"
android:inputType="text"
android:maxLines="1"
android:padding="@dimen/dp_11"
android:textColor="@color/black"
android:textSize="@dimen/sp_16" />
@ -140,44 +143,80 @@
<EditText
android:id="@+id/etPhone"
android:layout_marginLeft="@dimen/dp_10"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/dp_10"
android:layout_weight="2"
android:background="@drawable/shape_gray_5"
android:hint="电话"
android:inputType="phone"
android:maxLength="11"
android:maxLines="1"
android:padding="@dimen/dp_11"
android:textColor="#FF4A02"
android:textColor="@color/black"
android:textSize="@dimen/sp_16" />
</LinearLayout>
<EditText
android:id="@+id/etCom"
android:layout_marginTop="@dimen/dp_12"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_12"
android:background="@drawable/shape_gray_5"
android:hint="公司/个人名称"
android:hint="公司名称"
android:inputType="text"
android:maxLines="1"
android:padding="@dimen/dp_11"
android:textColor="#FF4A02"
android:textColor="@color/black"
android:textSize="@dimen/sp_16" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_18"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="是否企业用户" />
<com.dahe.mylibrary.weight.SwitchView
android:id="@+id/mySwitch"
android:layout_width="@dimen/dp_60"
android:layout_height="@dimen/dp_30"
app:isOpened="true"></com.dahe.mylibrary.weight.SwitchView>
</LinearLayout>
<EditText
android:id="@+id/etComNum"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_12"
android:background="@drawable/shape_gray_5"
android:hint="社会统一代码"
android:inputType="text"
android:maxLines="1"
android:padding="@dimen/dp_11"
android:textColor="@color/black"
android:textSize="@dimen/sp_16" />
</LinearLayout>
<TextView
android:visibility="gone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/dp_15"
android:layout_marginTop="@dimen/dp_13"
android:text="推荐地址"
android:textColor="@color/black"
android:textSize="@dimen/sp_16" />
android:textSize="@dimen/sp_16"
android:visibility="gone" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/dp_15"
@ -185,7 +224,8 @@
android:layout_marginRight="@dimen/dp_15"
android:background="@drawable/shape_white_8"
android:paddingTop="@dimen/dp_15"
android:paddingBottom="@dimen/dp_15" />
android:paddingBottom="@dimen/dp_15"
android:visibility="gone" />
</LinearLayout>

View File

@ -10,11 +10,20 @@
<include layout="@layout/common_toolbar"></include>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler"
android:layout_weight="1"
<com.scwang.smart.refresh.layout.SmartRefreshLayout
android:id="@+id/smartRefresh"
android:layout_width="match_parent"
android:layout_height="match_parent" />
android:layout_weight="1"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</com.scwang.smart.refresh.layout.SmartRefreshLayout>
<LinearLayout
android:id="@+id/llBtn"
android:layout_width="match_parent"

View File

@ -409,9 +409,11 @@ public class SwitchView extends View {
if (state == STATE_SWITCH_OFF) {
refreshState(STATE_SWITCH_OFF2);
listener.toggleToOn(this);
listener2.onToggle(true);
} else if (state == STATE_SWITCH_ON) {
refreshState(STATE_SWITCH_ON2);
listener.toggleToOff(this);
listener2.onToggle(false);
}
if (mOnClickListener != null) {
@ -435,6 +437,22 @@ public class SwitchView extends View {
void toggleToOff(SwitchView view);
}
public interface OnMyStateChangedListener {
void onToggle(boolean isOpen);
}
private OnMyStateChangedListener listener2 = new OnMyStateChangedListener() {
@Override
public void onToggle(boolean isOpen) {
// toggleSwitch(isOpen);
}
};
public void setOnStateChangedListener2(OnMyStateChangedListener listener) {
if (listener == null) throw new IllegalArgumentException("empty listener");
this.listener2 = listener;
}
private OnStateChangedListener listener = new OnStateChangedListener() {
@Override
public void toggleToOn(SwitchView view) {