Andorid 工作记录:BaseBottomSheetDialogFragment

112 阅读1分钟
 
  
import android.os.Bundle  
import android.view.LayoutInflater  
import android.view.View  
import android.view.ViewGroup  
import androidx.fragment.app.DialogFragment  
import androidx.fragment.app.FragmentActivity  
import androidx.lifecycle.ViewModelProvider  
import androidx.viewbinding.ViewBinding  
import com.net.shop.R  
import com.net.shop.utils.DialogUtils  
import com.google.android.material.bottomsheet.BottomSheetBehavior  
import com.google.android.material.bottomsheet.BottomSheetDialog  
import com.google.android.material.bottomsheet.BottomSheetDialogFragment  
import com.net.shop.http.base.BaseViewModel  
  
/**  
* 底部出 -- 不会被键盘顶起  
* https://www.jianshu.com/p/e460d4b47dd4  
* 禁止拖拽 ,禁止下拉关闭对话框 --  
*  
* 记住:如果滚动使用Recycleview,请设置recyclerView.setNestedScrollingEnabled(false);  
*/  
abstract class BaseBottomSheetDialogFragment<VB : ViewBinding>(val bindingBlock: (LayoutInflater, ViewGroup?, Boolean) -> VB) : BottomSheetDialogFragment(){  
private lateinit var _binding: VB  
protected val binding get() = _binding  
  
fun <T : BaseViewModel> getViewModel(clz: Class<T>) = ViewModelProvider(this)[clz]  
  
override fun onCreate(savedInstanceState: Bundle?) {  
super.onCreate(savedInstanceState)  
setStyle(STYLE_NORMAL, R.style.CustomBottomSheetDialogTheme)  
}  
  
override fun onStart() {  
setup()  
super.onStart()  
val behavior = getBehavior()  
if (behavior != null) {  
behavior.isHideable = false  
/*  
window有一个黑色背景的渐变动画,  
延迟300ms,等动画结束在执行菜单弹出动画。  
否则看起来很突兀  
*/  
view?.postDelayed({ behavior.state = BottomSheetBehavior.STATE_EXPANDED }, 300)  
}  
getBehavior()?.setBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() {  
override fun onStateChanged(bottomSheet: View, newState: Int) {  
//禁止拖拽 ,禁止下拉关闭对话框 -- 记住:如果滚动使用Recycleview,请设置recyclerView.setNestedScrollingEnabled(false);  
if(newState == BottomSheetBehavior.STATE_DRAGGING){  
getBehavior()?.state = BottomSheetBehavior.STATE_EXPANDED  
}  
}  
  
override fun onSlide(bottomSheet: View, slideOffset: Float) {  
  
}  
  
})  
}  
  
private fun setup() {  
val behavior: BottomSheetBehavior<*>? = getBehavior()  
behavior?.skipCollapsed = true  
behavior?.peekHeight = 0  
behavior?.isHideable = false  
}  
  
open fun getBehavior(): BottomSheetBehavior<*>? {  
try {  
/*val field: Field = BottomSheetDialog::class.java.getDeclaredField("mBehavior") ?: return null  
field.isAccessible = true  
return field[this] as BottomSheetBehavior<*>*/  
return (dialog as? BottomSheetDialog)?.behavior  
} catch (e: Exception) {  
e.printStackTrace()  
}  
return null  
}  
  
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {  
_binding = bindingBlock(inflater, container, false)  
return _binding.root  
}  
  
private fun setWindowTransparent() {  
val window = dialog?.window  
val windowParams = window?.attributes  
windowParams?.dimAmount = 0.0f  
window?.attributes = windowParams  
}  
  
/**  
* 无返回实体对话框  
*/  
fun showDialog(clz: DialogFragment, tag: String) {  
//防止 报 has not been attached yet.  
activity?.let {  
if(!it.isFinishing && !it.isDestroyed){  
DialogUtils.showDialog(clz, childFragmentManager, tag)  
}  
}  
}  
  
fun getActivity(block : (activity: FragmentActivity) -> Unit){  
activity?.let { _act ->  
if(!_act.isFinishing && !_act.isDestroyed){  
block(_act)  
}  
}  
}  
  
//fun <T : AndroidViewModel> getViewModel(clz:Class<T>) = ViewModelProvider(this).get(clz)  
}