修改第三方view 依赖注入 崩溃问题

This commit is contained in:
squallzhjch 2023-01-11 14:24:28 +08:00
parent 6f5962c560
commit e69ff5f97f
8 changed files with 173 additions and 171 deletions

View File

@ -30,17 +30,6 @@
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/Theme.NavinfoVolvo" android:theme="@style/Theme.NavinfoVolvo"
android:usesCleartextTraffic="true"> android:usesCleartextTraffic="true">
<activity
android:name=".ui.message.MessageActivity"
android:configChanges="orientation"
android:exported="false"
android:label="@string/title_activity_second"
android:screenOrientation="portrait"
android:theme="@style/Theme.NavinfoVolvo.NoActionBar">
<meta-data
android:name="android.app.lib_name"
android:value="" />
</activity>
<activity <activity
android:name="com.navinfo.volvo.ui.MainActivity" android:name="com.navinfo.volvo.ui.MainActivity"
android:exported="true" android:exported="true"

View File

@ -4,7 +4,9 @@ import android.os.Bundle
import android.util.Log import android.util.Log
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.View.inflate
import android.view.ViewGroup import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
@ -21,14 +23,14 @@ import com.navinfo.volvo.tools.DisplayUtil
import com.navinfo.volvo.ui.fragments.BaseFragment import com.navinfo.volvo.ui.fragments.BaseFragment
import com.yanzhenjie.recyclerview.* import com.yanzhenjie.recyclerview.*
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.io.IOException import java.io.IOException
@AndroidEntryPoint @AndroidEntryPoint
class HomeFragment : BaseFragment(), OnItemClickListener, OnItemMenuClickListener { class HomeFragment : BaseFragment(), OnItemClickListener, OnItemMenuClickListener {
private var _binding: FragmentHomeBinding? = null private lateinit var _binding: FragmentHomeBinding
private var headView: HomeAdapterNotingBinding? = null
// This property is only valid between onCreateView and // This property is only valid between onCreateView and
// onDestroyView. // onDestroyView.
@ -36,14 +38,15 @@ class HomeFragment : BaseFragment(), OnItemClickListener, OnItemMenuClickListene
private val viewModel by viewModels<HomeViewModel>() private val viewModel by viewModels<HomeViewModel>()
private val messageAdapter by lazy { HomeAdapter(this) } private val messageAdapter by lazy { HomeAdapter(this) }
private var headBinding: HomeAdapterNotingBinding? = null
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View { ): View {
_binding = FragmentHomeBinding.inflate(inflater, container, false) _binding = DataBindingUtil.inflate(inflater, R.layout.fragment_home, container, false)
val root: View = _binding!!.root // _binding = FragmentHomeBinding.inflate(inflater, container, false)
val root: View = _binding.root
_binding.lifecycleOwner = this
headBinding = HomeAdapterNotingBinding.inflate(inflater, container, false) headView = HomeAdapterNotingBinding.inflate(inflater, container, false)
initView() initView()
return root return root
} }
@ -51,9 +54,9 @@ class HomeFragment : BaseFragment(), OnItemClickListener, OnItemMenuClickListene
private fun initView() { private fun initView() {
//创建菜单选项 //创建菜单选项
//注意:使用滑动菜单不能开启滑动删除,否则只有滑动删除没有滑动菜单 //注意:使用滑动菜单不能开启滑动删除,否则只有滑动删除没有滑动菜单
var mSwipeMenuCreator = SwipeMenuCreator { _, rightMenu, _ -> val mSwipeMenuCreator = SwipeMenuCreator { _, rightMenu, _ ->
//预览 //预览
var previewItem = SwipeMenuItem(context) val previewItem = SwipeMenuItem(context)
previewItem.height = DisplayUtil.dip2px(requireContext(), 60f) previewItem.height = DisplayUtil.dip2px(requireContext(), 60f)
previewItem.width = DisplayUtil.dip2px(requireContext(), 80f) previewItem.width = DisplayUtil.dip2px(requireContext(), 80f)
previewItem.background = requireContext().getDrawable(R.color.yellow) previewItem.background = requireContext().getDrawable(R.color.yellow)
@ -62,7 +65,7 @@ class HomeFragment : BaseFragment(), OnItemClickListener, OnItemMenuClickListene
rightMenu.addMenuItem(previewItem) rightMenu.addMenuItem(previewItem)
//分享 //分享
var shareItem = SwipeMenuItem(context) val shareItem = SwipeMenuItem(context)
shareItem.height = DisplayUtil.dip2px(requireContext(), 60f) shareItem.height = DisplayUtil.dip2px(requireContext(), 60f)
shareItem.width = DisplayUtil.dip2px(requireContext(), 80f) shareItem.width = DisplayUtil.dip2px(requireContext(), 80f)
shareItem.background = requireContext().getDrawable(R.color.blue) shareItem.background = requireContext().getDrawable(R.color.blue)
@ -71,7 +74,7 @@ class HomeFragment : BaseFragment(), OnItemClickListener, OnItemMenuClickListene
rightMenu.addMenuItem(shareItem) rightMenu.addMenuItem(shareItem)
//添加菜单自动添加至尾部 //添加菜单自动添加至尾部
var deleteItem = SwipeMenuItem(context) val deleteItem = SwipeMenuItem(context)
deleteItem.height = DisplayUtil.dip2px(requireContext(), 60f) deleteItem.height = DisplayUtil.dip2px(requireContext(), 60f)
deleteItem.width = DisplayUtil.dip2px(requireContext(), 80f) deleteItem.width = DisplayUtil.dip2px(requireContext(), 80f)
deleteItem.text = requireContext().getString(R.string.delete) deleteItem.text = requireContext().getString(R.string.delete)
@ -82,26 +85,25 @@ class HomeFragment : BaseFragment(), OnItemClickListener, OnItemMenuClickListene
} }
val layoutManager = LinearLayoutManager(context) val layoutManager = LinearLayoutManager(context)
_binding?.let { _binding.homeRecyclerview.layoutManager = layoutManager
_binding!!.homeRecyclerview.layoutManager = layoutManager
//自动增加分割线 //自动增加分割线
_binding!!.homeRecyclerview.addItemDecoration( _binding.homeRecyclerview.addItemDecoration(
DividerItemDecoration( DividerItemDecoration(
context, layoutManager.orientation context, layoutManager.orientation
) )
) )
//增加侧滑按钮 //增加侧滑按钮
_binding!!.homeRecyclerview.setSwipeMenuCreator(mSwipeMenuCreator) _binding.homeRecyclerview.setSwipeMenuCreator(mSwipeMenuCreator)
//单项点击 //单项点击
_binding!!.homeRecyclerview.setOnItemClickListener(this) _binding.homeRecyclerview.setOnItemClickListener(this)
_binding!!.homeRecyclerview.setLoadMoreListener { _binding.homeRecyclerview.setLoadMoreListener {
Log.e("jingo", "下拉加载开始") Log.e("jingo", "下拉加载开始")
} // 加载更多的监听。 } // 加载更多的监听。
//开始下拉刷新 //开始下拉刷新
_binding!!.homeSwipeRefreshLayout.setOnRefreshListener { _binding.homeSwipeRefreshLayout.setOnRefreshListener {
Log.e("jingo", "开始刷新") Log.e("jingo", "开始刷新")
// viewModel.getNetMessageList() // viewModel.getNetMessageList()
messageAdapter.refresh() messageAdapter.refresh()
@ -116,7 +118,7 @@ class HomeFragment : BaseFragment(), OnItemClickListener, OnItemMenuClickListene
} }
} }
//侧滑菜单的监听必需在设置adapter之前 //侧滑菜单的监听必需在设置adapter之前
_binding!!.homeRecyclerview.setOnItemMenuClickListener { menuBridge, adapterPosition -> _binding.homeRecyclerview.setOnItemMenuClickListener { menuBridge, adapterPosition ->
menuBridge.closeMenu() menuBridge.closeMenu()
// val direction: Int = menuBridge.getDirection() // 左侧还是右侧菜单。 // val direction: Int = menuBridge.getDirection() // 左侧还是右侧菜单。
@ -132,37 +134,36 @@ class HomeFragment : BaseFragment(), OnItemClickListener, OnItemMenuClickListene
} }
} }
_binding!!.homeRecyclerview.adapter = messageAdapter _binding.homeRecyclerview.adapter = messageAdapter
//初始状态添加监听 //初始状态添加监听
messageAdapter.addLoadStateListener { messageAdapter.addLoadStateListener {
when (it.refresh) { when (it.refresh) {
is LoadState.NotLoading -> { is LoadState.NotLoading -> {
_binding!!.homeSwipeRefreshLayout.isRefreshing = false _binding.homeSwipeRefreshLayout.isRefreshing = false
if (messageAdapter.itemCount == 0) headView?.let {
_binding?.let {
_binding!!.homeRecyclerview.addHeaderView(headBinding?.root) if (messageAdapter.itemCount == 0) {
} if (_binding.homeRecyclerview.headerCount == 0)
else { _binding.homeRecyclerview.addHeaderView(headView!!.root)
_binding?.let { } else {
_binding!!.homeRecyclerview.removeHeaderView(headBinding?.root) if (_binding.homeRecyclerview.headerCount > 0)
_binding.homeRecyclerview.removeHeaderView(headView!!.root)
} }
} }
Log.d("jingo", "is NotLoading")
} }
is LoadState.Loading -> { is LoadState.Loading -> {
Log.d("jingo", "is Loading") _binding.homeSwipeRefreshLayout.isRefreshing = true
_binding!!.homeSwipeRefreshLayout.isRefreshing = true
} }
is LoadState.Error -> { is LoadState.Error -> {
_binding!!.homeSwipeRefreshLayout.isRefreshing = false _binding.homeSwipeRefreshLayout.isRefreshing = false
Log.d("jingo", "is Error:")
when ((it.refresh as LoadState.Error).error) { when ((it.refresh as LoadState.Error).error) {
is IOException -> { is IOException -> {
Log.d("jingo", "IOException") Log.d("jingo", "刷新 IOException $")
} }
else -> { else -> {
Log.d("jingo", "others exception") Log.d("jingo", "刷新 others exception")
} }
} }
} }
@ -170,7 +171,6 @@ class HomeFragment : BaseFragment(), OnItemClickListener, OnItemMenuClickListene
} }
loadMoreFinish() loadMoreFinish()
}
//监听数据请求是否结束 //监听数据请求是否结束
viewModel.isLoading.observe(viewLifecycleOwner, Observer { viewModel.isLoading.observe(viewLifecycleOwner, Observer {
@ -179,13 +179,11 @@ class HomeFragment : BaseFragment(), OnItemClickListener, OnItemMenuClickListene
} }
private fun loadMoreFinish() { private fun loadMoreFinish() {
_binding?.let { _binding.homeSwipeRefreshLayout.isRefreshing = false
_binding!!.homeSwipeRefreshLayout.isRefreshing = false
// 第一次加载数据:一定要掉用这个方法。 // 第一次加载数据:一定要掉用这个方法。
// 第一个参数表示此次数据是否为空假如你请求到的list为空(== null || list.size == 0)那么这里就要true。 // 第一个参数表示此次数据是否为空假如你请求到的list为空(== null || list.size == 0)那么这里就要true。
// 第二个参数表示是否还有更多数据根据服务器返回给你的page等信息判断是否还有更多这样可以提供性能如果不能判断则传true。 // 第二个参数表示是否还有更多数据根据服务器返回给你的page等信息判断是否还有更多这样可以提供性能如果不能判断则传true。
_binding!!.homeRecyclerview.loadMoreFinish(false, true) _binding.homeRecyclerview.loadMoreFinish(false, true)
}
} }
@ -196,8 +194,7 @@ class HomeFragment : BaseFragment(), OnItemClickListener, OnItemMenuClickListene
override fun onDestroyView() { override fun onDestroyView() {
super.onDestroyView() super.onDestroyView()
_binding = null headView = null
headBinding = null
} }
//点击项 //点击项

View File

@ -51,6 +51,7 @@ import com.nhaarman.supertooltips.ToolTip
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import indi.liyi.viewer.Utils import indi.liyi.viewer.Utils
import indi.liyi.viewer.ViewData import indi.liyi.viewer.ViewData
import me.jagar.chatvoiceplayerlibrary.VoicePlayerView
import top.zibin.luban.Luban import top.zibin.luban.Luban
import top.zibin.luban.OnCompressListener import top.zibin.luban.OnCompressListener
import java.io.File import java.io.File
@ -78,6 +79,8 @@ class ObtainMessageFragment : Fragment() {
// onDestroyView. // onDestroyView.
private val binding get() = _binding!! private val binding get() = _binding!!
private lateinit var voiceView: VoicePlayerView
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
@ -86,6 +89,10 @@ class ObtainMessageFragment : Fragment() {
_binding = FragmentObtainMessageBinding.inflate(inflater, container, false) _binding = FragmentObtainMessageBinding.inflate(inflater, container, false)
val root: View = binding.root val root: View = binding.root
voiceView =
LayoutInflater.from(requireActivity()).inflate(R.layout.widget_voice_player, null)
.findViewById(R.id.voicePlayerView)
_binding!!.llAudioPlay.addView(voiceView)
var messege = arguments?.getParcelable<GreetingMessage>("message") var messege = arguments?.getParcelable<GreetingMessage>("message")
if (messege == null) { if (messege == null) {
messege = GreetingMessage(who = obtainMessageViewModel.username) messege = GreetingMessage(who = obtainMessageViewModel.username)
@ -493,12 +500,12 @@ class ObtainMessageFragment : Fragment() {
} }
override fun success(file: File) { override fun success(file: File) {
binding.voicePlayerView.setAudio(localFile.absolutePath) voiceView.setAudio(localFile.absolutePath)
} }
}) })
} else { } else {
binding.voicePlayerView.setAudio(localFile.absolutePath) voiceView.setAudio(localFile.absolutePath)
} }
} }

View File

@ -1,7 +1,13 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools">
<data>
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".ui.fragments.home.HomeFragment"> tools:context=".ui.fragments.home.HomeFragment">
@ -44,4 +50,5 @@
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout> </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

View File

@ -232,24 +232,7 @@
android:layout_gravity="center" android:layout_gravity="center"
android:visibility="gone" android:visibility="gone"
android:orientation="horizontal"> android:orientation="horizontal">
<me.jagar.chatvoiceplayerlibrary.VoicePlayerView
android:id="@+id/voicePlayerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:enableVisualizer="true"
app:visualizationPlayedColor="@color/teal_200"
app:visualizationNotPlayedColor="@color/teal_700"
app:playPauseBackgroundColor="@color/teal_700"
app:timingBackgroundColor="@color/purple_200"
app:seekBarProgressColor="@color/purple_500"
app:showShareButton="false"
app:shareCornerRadius="100"
app:playPauseCornerRadius="100"
app:showTiming="true"
app:viewCornerRadius="100"
app:viewBackground="@android:color/transparent"
app:progressTimeColor="@color/purple_500"
app:seekBarThumbColor="@color/teal_200"/>
</LinearLayout> </LinearLayout>
<com.nhaarman.supertooltips.ToolTipRelativeLayout <com.nhaarman.supertooltips.ToolTipRelativeLayout

View File

@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<TextView <TextView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:gravity="center" android:gravity="center"
android:text="暂无数据,可下拉刷新" android:text="暂无数据,可下拉刷新" />
android:textSize="16sp" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<me.jagar.chatvoiceplayerlibrary.VoicePlayerView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/voicePlayerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:enableVisualizer="true"
app:playPauseBackgroundColor="@color/teal_700"
app:playPauseCornerRadius="100"
app:progressTimeColor="@color/purple_500"
app:seekBarProgressColor="@color/purple_500"
app:seekBarThumbColor="@color/teal_200"
app:shareCornerRadius="100"
app:showShareButton="false"
app:showTiming="true"
app:timingBackgroundColor="@color/purple_200"
app:viewBackground="@android:color/transparent"
app:viewCornerRadius="100"
app:visualizationNotPlayedColor="@color/teal_700"
app:visualizationPlayedColor="@color/teal_200" />

View File

@ -24,13 +24,11 @@
tools:layout="@layout/fragment_home"> tools:layout="@layout/fragment_home">
<action <action
android:id="@+id/action_home_to_obtainMessage" android:id="@+id/action_home_to_obtainMessage"
app:destination="@id/navigation_obtain_message" app:destination="@id/navigation_obtain_message" />
/>
<argument <argument
android:name="message" android:name="message"
app:nullable="true"
app:argType="com.navinfo.volvo.database.entity.GreetingMessage" app:argType="com.navinfo.volvo.database.entity.GreetingMessage"
/> app:nullable="true" />
</fragment> </fragment>
<fragment <fragment
@ -49,7 +47,6 @@
android:id="@+id/navigation_obtain_message" android:id="@+id/navigation_obtain_message"
android:name="com.navinfo.volvo.ui.fragments.message.ObtainMessageFragment" android:name="com.navinfo.volvo.ui.fragments.message.ObtainMessageFragment"
android:label="问候编辑" android:label="问候编辑"
tools:layout="@layout/fragment_obtain_message" > tools:layout="@layout/fragment_obtain_message"></fragment>
</fragment>
</navigation> </navigation>