setonkeylistner在我的Fragment中不起作用



我差点写了一本书的应用程序,我想传递卷键事件,当用户按下音量键时,会转到下一页,但我遇到了问题,当按下音量增大按钮时,nextPage方法并没有运行。我在OnViewCreated中使用了setonkeylistner,但它不起作用,我不知道其他方法。我的项目只有一个活动(MainActivity(,有许多碎片

抱歉我的英语不好

这是我的碎片代码

class ShowPoemBodyFragment : Fragment(){
private val viewModel: PoemBodyViewModel by viewModels()
private var binding: FragmentShowPoemsBinding by autoCleared()
private var shared: SharedPreferences? = null
private var mId by Delegates.notNull<Int>()
private var fId by Delegates.notNull<Int>()
private var size by Delegates.notNull<Int>()
private var sharedBackground: SharedPreferences? = null
private var sharedImage: SharedPreferences? = null
private val poemAdapter = PoemBodyAdapter()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentShowPoemsBinding.inflate(inflater, container, false)
return binding.root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.root.setOnKeyListener(View.OnKeyListener { _, keyCode, _ ->
if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
nextPage()
return@OnKeyListener true
} else
false
})
binding.poemBodyRecyclerView.adapter = poemAdapter
fId = requireArguments().getString("id")?.toIntOrNull()!!
size = requireArguments().getString("size")?.toIntOrNull()!!
viewModel.getPoemById(fId.toString())
Hawk.put("lastSeen", fId.toString())
Log.i("pomeid", fId.toString())
mId = fId
obserViewModel()
var fav: Int? = null
binding.markFavShowPoem.setOnClickListener {
if (fav == 1) {
fav = 0
binding.markFavShowPoem.setImageResource(R.drawable.ic_star)
} else {
fav = 1
binding.markFavShowPoem.setImageResource(R.drawable.ic_star_bold)
shared = context?.getSharedPreferences("shared_fav", Context.MODE_PRIVATE)
val editor: SharedPreferences.Editor = shared!!.edit()
editor.putString("id", mId.toString())
Toast.makeText(context, "به لیست علاقه مندی ها اضافه شد", Toast.LENGTH_SHORT).show()
editor.apply()
}

}
binding.textOption.setOnClickListener {
SubDialogFragmentPopUp().show(
requireActivity().supportFragmentManager,
"popUp"
)
}
if (mId == mId + size) {
binding.nextPage.visibility = View.INVISIBLE
} else
binding.nextPage.setOnClickListener {
nextPage()
}
if (mId == fId) {
binding.previousPage.visibility = View.INVISIBLE
}
else {
binding.previousPage.setOnClickListener{
mId -= 1
viewModel.getPoemById(mId.toString())
Hawk.put("lastSeen", mId.toString())
Log.i("pomeid", mId.toString())
obserViewModel()
}
}
//Set Background Text
sharedBackground =
context?.getSharedPreferences("shared_background_color", Context.MODE_PRIVATE)
val bbcg: Boolean = sharedBackground!!.getBoolean("bbcg", false)
if (bbcg) {
val color: Int = sharedBackground!!.getInt("background_color", 0)
view.background_show_poem_body.setBackgroundColor(color)
}
//Set Image
sharedImage = context?.getSharedPreferences("imagePoem", Context.MODE_PRIVATE)
val image: String? = sharedImage!!.getString("image", "")
context?.let {
Glide.with(this)
.load(image)
.centerCrop()
.error(R.drawable.ic_launcher_foreground)
.into(view.image_poem_adapter)
}
}
fun obserViewModel() {
viewModel.poemBody.observe(viewLifecycleOwner, Observer {
when (it.status) {
SUCCESS -> it.data?.let {
poemAdapter.updatePoems(it)
}
ERROR -> {
it.message?.let { requireActivity().toast(it) }
}
LOADING -> {
}
}
})
}
private fun nextPage(){
mId += 1
viewModel.getPoemById(mId.toString())
Hawk.put("lastSeen", mId.toString())
Log.i("pomeid", mId.toString())
obserViewModel()
}

}

override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean {
if (keyCode == KeyEvent.KEYCODE_VOLUME_UP){
// Do something
}
return super.onKeyUp(keyCode, event)
}

试试这个,看看

您需要使用ACTION_MEDIA_BUTTON来监听音量按钮按下情况。您必须覆盖关键事件。这里有一个链接,解释了它的用途和为什么

最新更新