diff --git a/app/src/main/java/io/legado/app/data/entities/rule/BookInfoRule.kt b/app/src/main/java/io/legado/app/data/entities/rule/BookInfoRule.kt index 882ffbad7..2c0a4509e 100644 --- a/app/src/main/java/io/legado/app/data/entities/rule/BookInfoRule.kt +++ b/app/src/main/java/io/legado/app/data/entities/rule/BookInfoRule.kt @@ -1,7 +1,8 @@ package io.legado.app.data.entities.rule import android.os.Parcelable -import kotlinx.android.parcel.Parcelize +import kotlinx.parcelize.Parcelize + @Parcelize data class BookInfoRule( diff --git a/app/src/main/java/io/legado/app/data/entities/rule/ContentRule.kt b/app/src/main/java/io/legado/app/data/entities/rule/ContentRule.kt index 7679810a9..7da6e9d57 100644 --- a/app/src/main/java/io/legado/app/data/entities/rule/ContentRule.kt +++ b/app/src/main/java/io/legado/app/data/entities/rule/ContentRule.kt @@ -1,7 +1,7 @@ package io.legado.app.data.entities.rule import android.os.Parcelable -import kotlinx.android.parcel.Parcelize +import kotlinx.parcelize.Parcelize @Parcelize data class ContentRule( diff --git a/app/src/main/java/io/legado/app/data/entities/rule/ExploreRule.kt b/app/src/main/java/io/legado/app/data/entities/rule/ExploreRule.kt index 41031e61e..bc2a425f5 100644 --- a/app/src/main/java/io/legado/app/data/entities/rule/ExploreRule.kt +++ b/app/src/main/java/io/legado/app/data/entities/rule/ExploreRule.kt @@ -1,7 +1,7 @@ package io.legado.app.data.entities.rule import android.os.Parcelable -import kotlinx.android.parcel.Parcelize +import kotlinx.parcelize.Parcelize @Parcelize data class ExploreRule( diff --git a/app/src/main/java/io/legado/app/data/entities/rule/SearchRule.kt b/app/src/main/java/io/legado/app/data/entities/rule/SearchRule.kt index f5683f05b..4c627cbc3 100644 --- a/app/src/main/java/io/legado/app/data/entities/rule/SearchRule.kt +++ b/app/src/main/java/io/legado/app/data/entities/rule/SearchRule.kt @@ -1,7 +1,8 @@ package io.legado.app.data.entities.rule import android.os.Parcelable -import kotlinx.android.parcel.Parcelize +import kotlinx.parcelize.Parcelize + @Parcelize data class SearchRule( diff --git a/app/src/main/java/io/legado/app/data/entities/rule/TocRule.kt b/app/src/main/java/io/legado/app/data/entities/rule/TocRule.kt index d040f3905..745d55519 100644 --- a/app/src/main/java/io/legado/app/data/entities/rule/TocRule.kt +++ b/app/src/main/java/io/legado/app/data/entities/rule/TocRule.kt @@ -1,7 +1,7 @@ package io.legado.app.data.entities.rule import android.os.Parcelable -import kotlinx.android.parcel.Parcelize +import kotlinx.parcelize.Parcelize @Parcelize data class TocRule( diff --git a/app/src/main/java/io/legado/app/ui/filepicker/FilePickerDialog.kt b/app/src/main/java/io/legado/app/ui/filepicker/FilePickerDialog.kt index 4617859bd..9c4d1358f 100644 --- a/app/src/main/java/io/legado/app/ui/filepicker/FilePickerDialog.kt +++ b/app/src/main/java/io/legado/app/ui/filepicker/FilePickerDialog.kt @@ -14,12 +14,13 @@ import androidx.fragment.app.FragmentManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import io.legado.app.R +import io.legado.app.databinding.DialogFileChooserBinding import io.legado.app.lib.theme.primaryColor import io.legado.app.ui.filepicker.adapter.FileAdapter import io.legado.app.ui.filepicker.adapter.PathAdapter import io.legado.app.ui.widget.recycler.VerticalDivider import io.legado.app.utils.* -import kotlinx.android.synthetic.main.dialog_file_chooser.* +import io.legado.app.utils.viewbindingdelegate.viewBinding import java.io.File @@ -61,6 +62,7 @@ class FilePickerDialog : DialogFragment(), } } + private val binding by viewBinding(DialogFileChooserBinding::bind) override var allowExtensions: Array? = null override val isSelectDir: Boolean get() = mode == DIRECTORY @@ -92,7 +94,7 @@ class FilePickerDialog : DialogFragment(), override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - tool_bar.setBackgroundColor(primaryColor) + binding.toolBar.setBackgroundColor(primaryColor) view.setBackgroundResource(R.color.background_card) arguments?.let { requestCode = it.getInt("requestCode") @@ -107,7 +109,7 @@ class FilePickerDialog : DialogFragment(), allowExtensions = it.getStringArray("allowExtensions") menus = it.getStringArray("menus") } - tool_bar.title = title ?: let { + binding.toolBar.title = title ?: let { if (isSelectDir) { getString(R.string.folder_chooser) } else { @@ -120,29 +122,29 @@ class FilePickerDialog : DialogFragment(), } private fun initMenu() { - tool_bar.inflateMenu(R.menu.file_chooser) + binding.toolBar.inflateMenu(R.menu.file_chooser) if (isSelectDir) { - tool_bar.menu.findItem(R.id.menu_ok).isVisible = true + binding.toolBar.menu.findItem(R.id.menu_ok).isVisible = true } menus?.let { it.forEach { menuTitle -> - tool_bar.menu.add(menuTitle) + binding.toolBar.menu.add(menuTitle) } } - tool_bar.menu.applyTint(requireContext()) - tool_bar.setOnMenuItemClickListener(this) + binding.toolBar.menu.applyTint(requireContext()) + binding.toolBar.setOnMenuItemClickListener(this) } private fun initContentView() { fileAdapter = FileAdapter(requireContext(), this) pathAdapter = PathAdapter(requireContext(), this) - rv_file.addItemDecoration(VerticalDivider(requireContext())) - rv_file.layoutManager = LinearLayoutManager(activity) - rv_file.adapter = fileAdapter + binding.rvFile.addItemDecoration(VerticalDivider(requireContext())) + binding.rvFile.layoutManager = LinearLayoutManager(activity) + binding.rvFile.adapter = fileAdapter - rv_path.layoutManager = LinearLayoutManager(activity, RecyclerView.HORIZONTAL, false) - rv_path.adapter = pathAdapter + binding.rvPath.layoutManager = LinearLayoutManager(activity, RecyclerView.HORIZONTAL, false) + binding.rvPath.adapter = pathAdapter } @@ -200,10 +202,10 @@ class FilePickerDialog : DialogFragment(), adapterCount-- } if (adapterCount < 1) { - tv_empty.visible() - tv_empty.setText(R.string.empty) + binding.tvEmpty.visible() + binding.tvEmpty.setText(R.string.empty) } else { - tv_empty.gone() + binding.tvEmpty.gone() } } diff --git a/app/src/main/java/io/legado/app/ui/filepicker/adapter/FileAdapter.kt b/app/src/main/java/io/legado/app/ui/filepicker/adapter/FileAdapter.kt index 624c44297..a4f295d41 100644 --- a/app/src/main/java/io/legado/app/ui/filepicker/adapter/FileAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/filepicker/adapter/FileAdapter.kt @@ -2,9 +2,9 @@ package io.legado.app.ui.filepicker.adapter import android.content.Context -import io.legado.app.R import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.SimpleRecyclerAdapter +import io.legado.app.databinding.ItemFileFilepickerBinding import io.legado.app.help.AppConfig import io.legado.app.lib.theme.getPrimaryDisabledTextColor import io.legado.app.lib.theme.getPrimaryTextColor @@ -12,14 +12,13 @@ import io.legado.app.ui.filepicker.entity.FileItem import io.legado.app.ui.filepicker.utils.ConvertUtils import io.legado.app.ui.filepicker.utils.FilePickerIcon import io.legado.app.utils.FileUtils -import kotlinx.android.synthetic.main.item_path_filepicker.view.* import org.jetbrains.anko.sdk27.listeners.onClick import java.io.File import java.util.* class FileAdapter(context: Context, val callBack: CallBack) : - SimpleRecyclerAdapter(context, R.layout.item_file_filepicker) { + SimpleRecyclerAdapter(context) { private var rootPath: String? = null var currentPath: String? = null private set @@ -86,29 +85,34 @@ class FileAdapter(context: Context, val callBack: CallBack) : } - override fun convert(holder: ItemViewHolder, item: FileItem, payloads: MutableList) { - holder.itemView.apply { - image_view.setImageDrawable(item.icon) - text_view.text = item.name + override fun convert( + holder: ItemViewHolder, + binding: ItemFileFilepickerBinding, + item: FileItem, + payloads: MutableList + ) { + binding.apply { + imageView.setImageDrawable(item.icon) + textView.text = item.name if (item.isDirectory) { - text_view.setTextColor(primaryTextColor) + textView.setTextColor(primaryTextColor) } else { if (callBack.isSelectDir) { - text_view.setTextColor(disabledTextColor) + textView.setTextColor(disabledTextColor) } else { callBack.allowExtensions?.let { if (it.isEmpty() || it.contains(FileUtils.getExtension(item.path))) { - text_view.setTextColor(primaryTextColor) + textView.setTextColor(primaryTextColor) } else { - text_view.setTextColor(disabledTextColor) + textView.setTextColor(disabledTextColor) } - } ?: text_view.setTextColor(primaryTextColor) + } ?: textView.setTextColor(primaryTextColor) } } } } - override fun registerListener(holder: ItemViewHolder) { + override fun registerListener(holder: ItemViewHolder, binding: ItemFileFilepickerBinding) { holder.itemView.onClick { callBack.onFileClick(holder.layoutPosition) } diff --git a/app/src/main/java/io/legado/app/ui/filepicker/adapter/PathAdapter.kt b/app/src/main/java/io/legado/app/ui/filepicker/adapter/PathAdapter.kt index 6a023fc51..def448dcd 100644 --- a/app/src/main/java/io/legado/app/ui/filepicker/adapter/PathAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/filepicker/adapter/PathAdapter.kt @@ -2,18 +2,17 @@ package io.legado.app.ui.filepicker.adapter import android.content.Context import android.os.Environment -import io.legado.app.R import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.SimpleRecyclerAdapter +import io.legado.app.databinding.ItemPathFilepickerBinding import io.legado.app.ui.filepicker.utils.ConvertUtils import io.legado.app.ui.filepicker.utils.FilePickerIcon -import kotlinx.android.synthetic.main.item_path_filepicker.view.* import org.jetbrains.anko.sdk27.listeners.onClick import java.util.* class PathAdapter(context: Context, val callBack: CallBack) : - SimpleRecyclerAdapter(context, R.layout.item_path_filepicker) { + SimpleRecyclerAdapter(context) { private val paths = LinkedList() private val arrowIcon = ConvertUtils.toDrawable(FilePickerIcon.getArrow()) @@ -44,14 +43,19 @@ class PathAdapter(context: Context, val callBack: CallBack) : setItems(paths) } - override fun convert(holder: ItemViewHolder, item: String, payloads: MutableList) { - holder.itemView.apply { - text_view.text = item - image_view.setImageDrawable(arrowIcon) + override fun convert( + holder: ItemViewHolder, + binding: ItemPathFilepickerBinding, + item: String, + payloads: MutableList + ) { + binding.apply { + textView.text = item + imageView.setImageDrawable(arrowIcon) } } - override fun registerListener(holder: ItemViewHolder) { + override fun registerListener(holder: ItemViewHolder, binding: ItemPathFilepickerBinding) { holder.itemView.onClick { callBack.onPathClick(holder.layoutPosition) } @@ -65,6 +69,6 @@ class PathAdapter(context: Context, val callBack: CallBack) : private const val ROOT_HINT = "SD" @Suppress("DEPRECATION") - val sdCardDirectory = Environment.getExternalStorageDirectory().absolutePath + val sdCardDirectory: String = Environment.getExternalStorageDirectory().absolutePath } } diff --git a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt index af453d8e2..341c33428 100644 --- a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt +++ b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt @@ -47,10 +47,6 @@ class MainActivity : VMBaseActivity(), private var pagePosition = 0 private val fragmentMap = hashMapOf() - override fun getViewBinding(): ActivityMainBinding { - return ActivityMainBinding.inflate(layoutInflater) - } - override fun onActivityCreated(savedInstanceState: Bundle?) { ATH.applyEdgeEffectColor(binding.viewPagerMain) ATH.applyBottomNavigationColor(binding.bottomNavigationView) diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterGrid.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterGrid.kt index d86f6e972..e4fb0c960 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterGrid.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterGrid.kt @@ -2,8 +2,6 @@ package io.legado.app.ui.main.bookshelf.books import android.content.Context import android.os.Bundle -import android.view.ViewGroup -import androidx.viewbinding.ViewBinding import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.constant.BookType import io.legado.app.data.entities.Book @@ -16,10 +14,6 @@ import org.jetbrains.anko.sdk27.listeners.onLongClick class BooksAdapterGrid(context: Context, private val callBack: CallBack) : BaseBooksAdapter(context) { - override fun getViewBinding(parent: ViewGroup, position: Int): ViewBinding { - return ItemBookshelfGridBinding.inflate(inflater, parent, false) - } - override fun convert( holder: ItemViewHolder, binding: ItemBookshelfGridBinding, diff --git a/app/src/main/java/io/legado/app/ui/replace/GroupManageDialog.kt b/app/src/main/java/io/legado/app/ui/replace/GroupManageDialog.kt index 031c45b7e..1bf5dd3ea 100644 --- a/app/src/main/java/io/legado/app/ui/replace/GroupManageDialog.kt +++ b/app/src/main/java/io/legado/app/ui/replace/GroupManageDialog.kt @@ -7,7 +7,6 @@ import android.view.LayoutInflater import android.view.MenuItem import android.view.View import android.view.ViewGroup -import android.widget.EditText import androidx.appcompat.widget.Toolbar import androidx.fragment.app.DialogFragment import androidx.recyclerview.widget.LinearLayoutManager @@ -16,19 +15,21 @@ import io.legado.app.R import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.SimpleRecyclerAdapter import io.legado.app.constant.AppPattern +import io.legado.app.databinding.DialogEditTextBinding +import io.legado.app.databinding.DialogRecyclerViewBinding +import io.legado.app.databinding.ItemGroupManageBinding import io.legado.app.lib.dialogs.alert import io.legado.app.lib.theme.backgroundColor import io.legado.app.lib.theme.primaryColor import io.legado.app.ui.widget.recycler.VerticalDivider import io.legado.app.utils.* -import kotlinx.android.synthetic.main.dialog_edit_text.view.* -import kotlinx.android.synthetic.main.dialog_recycler_view.* -import kotlinx.android.synthetic.main.item_group_manage.view.* +import io.legado.app.utils.viewbindingdelegate.viewBinding import org.jetbrains.anko.sdk27.listeners.onClick class GroupManageDialog : DialogFragment(), Toolbar.OnMenuItemClickListener { private lateinit var viewModel: ReplaceRuleViewModel private lateinit var adapter: GroupAdapter + private val binding by viewBinding(DialogRecyclerViewBinding::bind) override fun onStart() { super.onStart() @@ -48,19 +49,19 @@ class GroupManageDialog : DialogFragment(), Toolbar.OnMenuItemClickListener { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) view.setBackgroundColor(backgroundColor) - tool_bar.setBackgroundColor(primaryColor) + binding.toolBar.setBackgroundColor(primaryColor) initData() } - private fun initData() { - tool_bar.title = getString(R.string.group_manage) - tool_bar.inflateMenu(R.menu.group_manage) - tool_bar.menu.applyTint(requireContext()) - tool_bar.setOnMenuItemClickListener(this) + private fun initData() = with(binding) { + toolBar.title = getString(R.string.group_manage) + toolBar.inflateMenu(R.menu.group_manage) + toolBar.menu.applyTint(requireContext()) + toolBar.setOnMenuItemClickListener(this@GroupManageDialog) adapter = GroupAdapter(requireContext()) - recycler_view.layoutManager = LinearLayoutManager(requireContext()) - recycler_view.addItemDecoration(VerticalDivider(requireContext())) - recycler_view.adapter = adapter + recyclerView.layoutManager = LinearLayoutManager(requireContext()) + recyclerView.addItemDecoration(VerticalDivider(requireContext())) + recyclerView.adapter = adapter App.db.replaceRuleDao().liveGroup().observe(viewLifecycleOwner, { val groups = linkedSetOf() it.map { group -> @@ -80,16 +81,14 @@ class GroupManageDialog : DialogFragment(), Toolbar.OnMenuItemClickListener { @SuppressLint("InflateParams") private fun addGroup() { alert(title = getString(R.string.add_group)) { - var editText: EditText? = null + val alertBinding = DialogEditTextBinding.inflate(layoutInflater) customView { - layoutInflater.inflate(R.layout.dialog_edit_text, null).apply { - editText = edit_view.apply { - hint = "分组名称" - } - } + alertBinding.apply { + editView.hint = "分组名称" + }.root } yesButton { - editText?.text?.toString()?.let { + alertBinding.editView.text?.toString()?.let { if (it.isNotBlank()) { viewModel.addGroup(it) } @@ -102,41 +101,42 @@ class GroupManageDialog : DialogFragment(), Toolbar.OnMenuItemClickListener { @SuppressLint("InflateParams") private fun editGroup(group: String) { alert(title = getString(R.string.group_edit)) { - var editText: EditText? = null - customView { - layoutInflater.inflate(R.layout.dialog_edit_text, null).apply { - editText = edit_view.apply { - hint = "分组名称" - setText(group) - } - } - } + val alertBinding = DialogEditTextBinding.inflate(layoutInflater) + customView = alertBinding.apply { + editView.hint = "分组名称" + editView.setText(group) + }.root yesButton { - viewModel.upGroup(group, editText?.text?.toString()) + viewModel.upGroup(group, alertBinding.editView.text?.toString()) } noButton() }.show().requestInputMethod() } private inner class GroupAdapter(context: Context) : - SimpleRecyclerAdapter(context, R.layout.item_group_manage) { + SimpleRecyclerAdapter(context) { - override fun convert(holder: ItemViewHolder, item: String, payloads: MutableList) { - with(holder.itemView) { - setBackgroundColor(context.backgroundColor) - tv_group.text = item + override fun convert( + holder: ItemViewHolder, + binding: ItemGroupManageBinding, + item: String, + payloads: MutableList + ) { + with(binding) { + root.setBackgroundColor(context.backgroundColor) + tvGroup.text = item } } - override fun registerListener(holder: ItemViewHolder) { - holder.itemView.apply { - tv_edit.onClick { + override fun registerListener(holder: ItemViewHolder, binding: ItemGroupManageBinding) { + binding.apply { + tvEdit.onClick { getItem(holder.layoutPosition)?.let { editGroup(it) } } - tv_del.onClick { + tvDel.onClick { getItem(holder.layoutPosition)?.let { viewModel.delGroup(it) } } } diff --git a/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleAdapter.kt b/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleAdapter.kt index 193a82f77..8badf87ff 100644 --- a/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleAdapter.kt @@ -10,16 +10,16 @@ import io.legado.app.R import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.SimpleRecyclerAdapter import io.legado.app.data.entities.ReplaceRule +import io.legado.app.databinding.ItemReplaceRuleBinding import io.legado.app.lib.theme.backgroundColor import io.legado.app.ui.widget.recycler.DragSelectTouchHelper import io.legado.app.ui.widget.recycler.ItemTouchCallback -import kotlinx.android.synthetic.main.item_replace_rule.view.* import org.jetbrains.anko.sdk27.listeners.onClick import java.util.* class ReplaceRuleAdapter(context: Context, var callBack: CallBack) : - SimpleRecyclerAdapter(context, R.layout.item_replace_rule), + SimpleRecyclerAdapter(context), ItemTouchCallback.Callback { private val selected = linkedSetOf() @@ -54,53 +54,58 @@ class ReplaceRuleAdapter(context: Context, var callBack: CallBack) : return selection } - override fun convert(holder: ItemViewHolder, item: ReplaceRule, payloads: MutableList) { - with(holder.itemView) { + override fun convert( + holder: ItemViewHolder, + binding: ItemReplaceRuleBinding, + item: ReplaceRule, + payloads: MutableList + ) { + with(binding) { val bundle = payloads.getOrNull(0) as? Bundle if (bundle == null) { - this.setBackgroundColor(context.backgroundColor) + root.setBackgroundColor(context.backgroundColor) if (item.group.isNullOrEmpty()) { - cb_name.text = item.name + cbName.text = item.name } else { - cb_name.text = + cbName.text = String.format("%s (%s)", item.name, item.group) } - swt_enabled.isChecked = item.isEnabled - cb_name.isChecked = selected.contains(item) + swtEnabled.isChecked = item.isEnabled + cbName.isChecked = selected.contains(item) } else { bundle.keySet().map { when (it) { - "selected" -> cb_name.isChecked = selected.contains(item) + "selected" -> cbName.isChecked = selected.contains(item) "name", "group" -> if (item.group.isNullOrEmpty()) { - cb_name.text = item.name + cbName.text = item.name } else { - cb_name.text = + cbName.text = String.format("%s (%s)", item.name, item.group) } - "enabled" -> swt_enabled.isChecked = item.isEnabled + "enabled" -> swtEnabled.isChecked = item.isEnabled } } } } } - override fun registerListener(holder: ItemViewHolder) { - holder.itemView.apply { - swt_enabled.setOnCheckedChangeListener { _, isChecked -> + override fun registerListener(holder: ItemViewHolder, binding: ItemReplaceRuleBinding) { + binding.apply { + swtEnabled.setOnCheckedChangeListener { _, isChecked -> getItem(holder.layoutPosition)?.let { it.isEnabled = isChecked callBack.update(it) } } - iv_edit.onClick { + ivEdit.onClick { getItem(holder.layoutPosition)?.let { callBack.edit(it) } } - cb_name.onClick { + cbName.onClick { getItem(holder.layoutPosition)?.let { - if (cb_name.isChecked) { + if (cbName.isChecked) { selected.add(it) } else { selected.remove(it) @@ -108,8 +113,8 @@ class ReplaceRuleAdapter(context: Context, var callBack: CallBack) : } callBack.upCountView() } - iv_menu_more.onClick { - showMenu(iv_menu_more, holder.layoutPosition) + ivMenuMore.onClick { + showMenu(ivMenuMore, holder.layoutPosition) } } } diff --git a/app/src/main/java/io/legado/app/ui/replace/edit/ReplaceEditActivity.kt b/app/src/main/java/io/legado/app/ui/replace/edit/ReplaceEditActivity.kt index 902b2fa24..336ec08e6 100644 --- a/app/src/main/java/io/legado/app/ui/replace/edit/ReplaceEditActivity.kt +++ b/app/src/main/java/io/legado/app/ui/replace/edit/ReplaceEditActivity.kt @@ -20,8 +20,8 @@ import io.legado.app.ui.widget.KeyboardToolPop import io.legado.app.ui.widget.dialog.TextDialog import io.legado.app.utils.getViewModel import io.legado.app.utils.postEvent -import kotlinx.android.synthetic.main.activity_replace_edit.* import org.jetbrains.anko.displayMetrics +import org.jetbrains.anko.sdk27.listeners.onClick import org.jetbrains.anko.selector import org.jetbrains.anko.toast import kotlin.math.abs @@ -58,17 +58,13 @@ class ReplaceEditActivity : private var mSoftKeyboardTool: PopupWindow? = null private var mIsSoftKeyBoardShowing = false - override fun getViewBinding(): ActivityReplaceEditBinding { - return ActivityReplaceEditBinding.inflate(layoutInflater) - } - override fun onActivityCreated(savedInstanceState: Bundle?) { mSoftKeyboardTool = KeyboardToolPop(this, AppConst.keyboardToolChars, this) window.decorView.viewTreeObserver.addOnGlobalLayoutListener(this) viewModel.initData(intent) { upReplaceView(it) } - iv_help.onClick { + binding.ivHelp.onClick { showRegexHelp() } } @@ -95,23 +91,23 @@ class ReplaceEditActivity : return true } - private fun upReplaceView(replaceRule: ReplaceRule) { - et_name.setText(replaceRule.name) - et_group.setText(replaceRule.group) - et_replace_rule.setText(replaceRule.pattern) - cb_use_regex.isChecked = replaceRule.isRegex - et_replace_to.setText(replaceRule.replacement) - et_scope.setText(replaceRule.scope) + private fun upReplaceView(replaceRule: ReplaceRule) = with(binding) { + etName.setText(replaceRule.name) + etGroup.setText(replaceRule.group) + etReplaceRule.setText(replaceRule.pattern) + cbUseRegex.isChecked = replaceRule.isRegex + etReplaceTo.setText(replaceRule.replacement) + etScope.setText(replaceRule.scope) } - private fun getReplaceRule(): ReplaceRule { + private fun getReplaceRule(): ReplaceRule = with(binding) { val replaceRule: ReplaceRule = viewModel.replaceRule ?: ReplaceRule() - replaceRule.name = et_name.text.toString() - replaceRule.group = et_group.text.toString() - replaceRule.pattern = et_replace_rule.text.toString() - replaceRule.isRegex = cb_use_regex.isChecked - replaceRule.replacement = et_replace_to.text.toString() - replaceRule.scope = et_scope.text.toString() + replaceRule.name = etName.text.toString() + replaceRule.group = etGroup.text.toString() + replaceRule.pattern = etReplaceRule.text.toString() + replaceRule.isRegex = cbUseRegex.isChecked + replaceRule.replacement = etReplaceTo.text.toString() + replaceRule.scope = etScope.text.toString() return replaceRule } @@ -158,7 +154,7 @@ class ReplaceEditActivity : mSoftKeyboardTool?.let { if (it.isShowing) return if (!isFinishing) { - it.showAtLocation(ll_content, Gravity.BOTTOM, 0, 0) + it.showAtLocation(binding.llContent, Gravity.BOTTOM, 0, 0) } } } @@ -176,11 +172,11 @@ class ReplaceEditActivity : val preShowing = mIsSoftKeyBoardShowing if (abs(keyboardHeight) > screenHeight / 5) { mIsSoftKeyBoardShowing = true // 超过屏幕五分之一则表示弹出了输入法 - root_view.setPadding(0, 0, 0, 100) + binding.rootView.setPadding(0, 0, 0, 100) showKeyboardTopPopupWindow() } else { mIsSoftKeyBoardShowing = false - root_view.setPadding(0, 0, 0, 0) + binding.rootView.setPadding(0, 0, 0, 0) if (preShowing) { closePopupWindow() } diff --git a/app/src/main/java/io/legado/app/ui/rss/article/BaseRssArticlesAdapter.kt b/app/src/main/java/io/legado/app/ui/rss/article/BaseRssArticlesAdapter.kt new file mode 100644 index 000000000..6830f64d1 --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/rss/article/BaseRssArticlesAdapter.kt @@ -0,0 +1,16 @@ +package io.legado.app.ui.rss.article + +import android.content.Context +import androidx.viewbinding.ViewBinding +import io.legado.app.base.adapter.SimpleRecyclerAdapter +import io.legado.app.data.entities.RssArticle + + +abstract class BaseRssArticlesAdapter(context: Context, val callBack: CallBack) : + SimpleRecyclerAdapter(context) { + + interface CallBack { + val isGridLayout: Boolean + fun readRss(rssArticle: RssArticle) + } +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesAdapter.kt b/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesAdapter.kt index 13f3e59cb..a3f5e9252 100644 --- a/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesAdapter.kt @@ -1,6 +1,5 @@ package io.legado.app.ui.rss.article -import android.annotation.SuppressLint import android.content.Context import android.graphics.drawable.Drawable import com.bumptech.glide.load.DataSource @@ -9,26 +8,28 @@ import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.target.Target import io.legado.app.R import io.legado.app.base.adapter.ItemViewHolder -import io.legado.app.base.adapter.SimpleRecyclerAdapter import io.legado.app.data.entities.RssArticle +import io.legado.app.databinding.ItemRssArticleBinding import io.legado.app.help.ImageLoader import io.legado.app.utils.gone import io.legado.app.utils.visible -import kotlinx.android.synthetic.main.item_rss_article.view.* import org.jetbrains.anko.sdk27.listeners.onClick import org.jetbrains.anko.textColorResource +class RssArticlesAdapter(context: Context, callBack: CallBack) : + BaseRssArticlesAdapter(context, callBack) { -class RssArticlesAdapter(context: Context, layoutId: Int, val callBack: CallBack) : - SimpleRecyclerAdapter(context, layoutId) { - - @SuppressLint("CheckResult") - override fun convert(holder: ItemViewHolder, item: RssArticle, payloads: MutableList) { - with(holder.itemView) { - tv_title.text = item.title - tv_pub_date.text = item.pubDate + override fun convert( + holder: ItemViewHolder, + binding: ItemRssArticleBinding, + item: RssArticle, + payloads: MutableList + ) { + with(binding) { + tvTitle.text = item.title + tvPubDate.text = item.pubDate if (item.image.isNullOrBlank() && !callBack.isGridLayout) { - image_view.gone() + imageView.gone() } else { ImageLoader.load(context, item.image).apply { if (callBack.isGridLayout) { @@ -41,7 +42,7 @@ class RssArticlesAdapter(context: Context, layoutId: Int, val callBack: CallBack target: Target?, isFirstResource: Boolean ): Boolean { - image_view.gone() + imageView.gone() return false } @@ -52,23 +53,23 @@ class RssArticlesAdapter(context: Context, layoutId: Int, val callBack: CallBack dataSource: DataSource?, isFirstResource: Boolean ): Boolean { - image_view.visible() + imageView.visible() return false } }) } - }.into(image_view) + }.into(imageView) } if (item.read) { - tv_title.textColorResource = R.color.tv_text_summary + tvTitle.textColorResource = R.color.tv_text_summary } else { - tv_title.textColorResource = R.color.primaryText + tvTitle.textColorResource = R.color.primaryText } } } - override fun registerListener(holder: ItemViewHolder) { + override fun registerListener(holder: ItemViewHolder, binding: ItemRssArticleBinding) { holder.itemView.onClick { getItem(holder.layoutPosition)?.let { callBack.readRss(it) @@ -76,8 +77,4 @@ class RssArticlesAdapter(context: Context, layoutId: Int, val callBack: CallBack } } - interface CallBack { - val isGridLayout: Boolean - fun readRss(rssArticle: RssArticle) - } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesAdapter1.kt b/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesAdapter1.kt new file mode 100644 index 000000000..2997680a6 --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesAdapter1.kt @@ -0,0 +1,80 @@ +package io.legado.app.ui.rss.article + +import android.content.Context +import android.graphics.drawable.Drawable +import com.bumptech.glide.load.DataSource +import com.bumptech.glide.load.engine.GlideException +import com.bumptech.glide.request.RequestListener +import com.bumptech.glide.request.target.Target +import io.legado.app.R +import io.legado.app.base.adapter.ItemViewHolder +import io.legado.app.data.entities.RssArticle +import io.legado.app.databinding.ItemRssArticle1Binding +import io.legado.app.help.ImageLoader +import io.legado.app.utils.gone +import io.legado.app.utils.visible +import org.jetbrains.anko.sdk27.listeners.onClick +import org.jetbrains.anko.textColorResource + +class RssArticlesAdapter1(context: Context, callBack: CallBack) : + BaseRssArticlesAdapter(context, callBack) { + + override fun convert( + holder: ItemViewHolder, + binding: ItemRssArticle1Binding, + item: RssArticle, + payloads: MutableList + ) { + with(binding) { + tvTitle.text = item.title + tvPubDate.text = item.pubDate + if (item.image.isNullOrBlank() && !callBack.isGridLayout) { + imageView.gone() + } else { + ImageLoader.load(context, item.image).apply { + if (callBack.isGridLayout) { + placeholder(R.drawable.image_rss_article) + } else { + addListener(object : RequestListener { + override fun onLoadFailed( + e: GlideException?, + model: Any?, + target: Target?, + isFirstResource: Boolean + ): Boolean { + imageView.gone() + return false + } + + override fun onResourceReady( + resource: Drawable?, + model: Any?, + target: Target?, + dataSource: DataSource?, + isFirstResource: Boolean + ): Boolean { + imageView.visible() + return false + } + + }) + } + }.into(imageView) + } + if (item.read) { + tvTitle.textColorResource = R.color.tv_text_summary + } else { + tvTitle.textColorResource = R.color.primaryText + } + } + } + + override fun registerListener(holder: ItemViewHolder, binding: ItemRssArticle1Binding) { + holder.itemView.onClick { + getItem(holder.layoutPosition)?.let { + callBack.readRss(it) + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesAdapter2.kt b/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesAdapter2.kt new file mode 100644 index 000000000..321da3427 --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesAdapter2.kt @@ -0,0 +1,80 @@ +package io.legado.app.ui.rss.article + +import android.content.Context +import android.graphics.drawable.Drawable +import com.bumptech.glide.load.DataSource +import com.bumptech.glide.load.engine.GlideException +import com.bumptech.glide.request.RequestListener +import com.bumptech.glide.request.target.Target +import io.legado.app.R +import io.legado.app.base.adapter.ItemViewHolder +import io.legado.app.data.entities.RssArticle +import io.legado.app.databinding.ItemRssArticle2Binding +import io.legado.app.help.ImageLoader +import io.legado.app.utils.gone +import io.legado.app.utils.visible +import org.jetbrains.anko.sdk27.listeners.onClick +import org.jetbrains.anko.textColorResource + +class RssArticlesAdapter2(context: Context, callBack: CallBack) : + BaseRssArticlesAdapter(context, callBack) { + + override fun convert( + holder: ItemViewHolder, + binding: ItemRssArticle2Binding, + item: RssArticle, + payloads: MutableList + ) { + with(binding) { + tvTitle.text = item.title + tvPubDate.text = item.pubDate + if (item.image.isNullOrBlank() && !callBack.isGridLayout) { + imageView.gone() + } else { + ImageLoader.load(context, item.image).apply { + if (callBack.isGridLayout) { + placeholder(R.drawable.image_rss_article) + } else { + addListener(object : RequestListener { + override fun onLoadFailed( + e: GlideException?, + model: Any?, + target: Target?, + isFirstResource: Boolean + ): Boolean { + imageView.gone() + return false + } + + override fun onResourceReady( + resource: Drawable?, + model: Any?, + target: Target?, + dataSource: DataSource?, + isFirstResource: Boolean + ): Boolean { + imageView.visible() + return false + } + + }) + } + }.into(imageView) + } + if (item.read) { + tvTitle.textColorResource = R.color.tv_text_summary + } else { + tvTitle.textColorResource = R.color.primaryText + } + } + } + + override fun registerListener(holder: ItemViewHolder, binding: ItemRssArticle2Binding) { + holder.itemView.onClick { + getItem(holder.layoutPosition)?.let { + callBack.readRss(it) + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesFragment.kt b/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesFragment.kt index 00efa768b..378c17397 100644 --- a/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesFragment.kt +++ b/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesFragment.kt @@ -10,6 +10,8 @@ import io.legado.app.App import io.legado.app.R import io.legado.app.base.VMBaseFragment import io.legado.app.data.entities.RssArticle +import io.legado.app.databinding.FragmentRssArticlesBinding +import io.legado.app.databinding.ViewLoadMoreBinding import io.legado.app.lib.theme.ATH import io.legado.app.ui.rss.read.ReadRssActivity import io.legado.app.ui.widget.recycler.LoadMoreView @@ -17,12 +19,10 @@ import io.legado.app.ui.widget.recycler.VerticalDivider import io.legado.app.utils.getViewModel import io.legado.app.utils.getViewModelOfActivity import io.legado.app.utils.startActivity -import kotlinx.android.synthetic.main.fragment_rss_articles.* -import kotlinx.android.synthetic.main.view_load_more.view.* -import kotlinx.android.synthetic.main.view_refresh_recycler.* +import io.legado.app.utils.viewbindingdelegate.viewBinding class RssArticlesFragment : VMBaseFragment(R.layout.fragment_rss_articles), - RssArticlesAdapter.CallBack { + BaseRssArticlesAdapter.CallBack { companion object { fun create(sortName: String, sortUrl: String): RssArticlesFragment { @@ -35,11 +35,12 @@ class RssArticlesFragment : VMBaseFragment(R.layout.fragme } } + private val binding by viewBinding(FragmentRssArticlesBinding::bind) private val activityViewModel: RssSortViewModel get() = getViewModelOfActivity(RssSortViewModel::class.java) override val viewModel: RssArticlesViewModel get() = getViewModel(RssArticlesViewModel::class.java) - lateinit var adapter: RssArticlesAdapter + lateinit var adapter: BaseRssArticlesAdapter<*> private lateinit var loadMoreView: LoadMoreView private var rssArticlesData: LiveData>? = null override val isGridLayout: Boolean @@ -48,31 +49,36 @@ class RssArticlesFragment : VMBaseFragment(R.layout.fragme override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { viewModel.init(arguments) initView() - refresh_recycler_view.startLoading() + binding.refreshRecyclerView.startLoading() initView() initData() } - private fun initView() { - ATH.applyEdgeEffectColor(recycler_view) - recycler_view.layoutManager = if (activityViewModel.isGridLayout) { - recycler_view.setPadding(8, 0, 8, 0) + private fun initView() = with(binding) { + ATH.applyEdgeEffectColor(refreshRecyclerView.recyclerView) + refreshRecyclerView.recyclerView.layoutManager = if (activityViewModel.isGridLayout) { + refreshRecyclerView.recyclerView.setPadding(8, 0, 8, 0) GridLayoutManager(requireContext(), 2) } else { - recycler_view.addItemDecoration(VerticalDivider(requireContext())) + refreshRecyclerView.recyclerView.addItemDecoration(VerticalDivider(requireContext())) LinearLayoutManager(requireContext()) } - adapter = RssArticlesAdapter(requireContext(), activityViewModel.layoutId, this) - recycler_view.adapter = adapter + adapter = when (activityViewModel.rssSource?.articleStyle) { + 1 -> RssArticlesAdapter1(requireContext(), this@RssArticlesFragment) + 2 -> RssArticlesAdapter2(requireContext(), this@RssArticlesFragment) + else -> RssArticlesAdapter(requireContext(), this@RssArticlesFragment) + } + refreshRecyclerView.recyclerView.adapter = adapter loadMoreView = LoadMoreView(requireContext()) - adapter.addFooterView(loadMoreView) - refresh_recycler_view.onRefreshStart = { + adapter.addFooterView(ViewLoadMoreBinding.bind(loadMoreView)) + refreshRecyclerView.onRefreshStart = { activityViewModel.rssSource?.let { viewModel.loadContent(it) } } - recycler_view.addOnScrollListener(object : RecyclerView.OnScrollListener() { + refreshRecyclerView.recyclerView.addOnScrollListener(object : + RecyclerView.OnScrollListener() { override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { super.onScrolled(recyclerView, dx, dy) if (!recyclerView.canScrollVertically(1)) { @@ -95,7 +101,7 @@ class RssArticlesFragment : VMBaseFragment(R.layout.fragme private fun scrollToBottom() { if (viewModel.isLoading) return if (loadMoreView.hasMore && adapter.getActualItemCount() > 0) { - loadMoreView.rotate_loading.show() + loadMoreView.startLoad() activityViewModel.rssSource?.let { viewModel.loadMore(it) } @@ -104,7 +110,7 @@ class RssArticlesFragment : VMBaseFragment(R.layout.fragme override fun observeLiveBus() { viewModel.loadFinally.observe(viewLifecycleOwner) { - refresh_recycler_view.stopLoading() + binding.refreshRecyclerView.stopLoading() if (it) { loadMoreView.startLoad() } else { diff --git a/app/src/main/java/io/legado/app/ui/rss/article/RssSortViewModel.kt b/app/src/main/java/io/legado/app/ui/rss/article/RssSortViewModel.kt index 135064bce..834f761da 100644 --- a/app/src/main/java/io/legado/app/ui/rss/article/RssSortViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/rss/article/RssSortViewModel.kt @@ -4,7 +4,6 @@ import android.app.Application import android.content.Intent import androidx.lifecycle.MutableLiveData import io.legado.app.App -import io.legado.app.R import io.legado.app.base.BaseViewModel import io.legado.app.data.entities.RssArticle import io.legado.app.data.entities.RssReadRecord @@ -17,12 +16,6 @@ class RssSortViewModel(application: Application) : BaseViewModel(application) { val titleLiveData = MutableLiveData() var order = System.currentTimeMillis() val isGridLayout get() = rssSource?.articleStyle == 2 - val layoutId - get() = when (rssSource?.articleStyle) { - 1 -> R.layout.item_rss_article_1 - 2 -> R.layout.item_rss_article_2 - else -> R.layout.item_rss_article - } fun initData(intent: Intent, finally: () -> Unit) { execute { diff --git a/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesAdapter.kt b/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesAdapter.kt index 6077d5db9..8b3eefa03 100644 --- a/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesAdapter.kt @@ -6,25 +6,29 @@ import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.target.Target -import io.legado.app.R import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.SimpleRecyclerAdapter import io.legado.app.data.entities.RssStar +import io.legado.app.databinding.ItemRssArticleBinding import io.legado.app.help.ImageLoader import io.legado.app.utils.gone import io.legado.app.utils.visible -import kotlinx.android.synthetic.main.item_rss_article.view.* import org.jetbrains.anko.sdk27.listeners.onClick class RssFavoritesAdapter(context: Context, val callBack: CallBack) : - SimpleRecyclerAdapter(context, R.layout.item_rss_article) { + SimpleRecyclerAdapter(context) { - override fun convert(holder: ItemViewHolder, item: RssStar, payloads: MutableList) { - with(holder.itemView) { - tv_title.text = item.title - tv_pub_date.text = item.pubDate + override fun convert( + holder: ItemViewHolder, + binding: ItemRssArticleBinding, + item: RssStar, + payloads: MutableList + ) { + with(binding) { + tvTitle.text = item.title + tvPubDate.text = item.pubDate if (item.image.isNullOrBlank()) { - image_view.gone() + imageView.gone() } else { ImageLoader.load(context, item.image) .addListener(object : RequestListener { @@ -34,7 +38,7 @@ class RssFavoritesAdapter(context: Context, val callBack: CallBack) : target: Target?, isFirstResource: Boolean ): Boolean { - image_view.gone() + imageView.gone() return false } @@ -45,17 +49,17 @@ class RssFavoritesAdapter(context: Context, val callBack: CallBack) : dataSource: DataSource?, isFirstResource: Boolean ): Boolean { - image_view.visible() + imageView.visible() return false } }) - .into(image_view) + .into(imageView) } } } - override fun registerListener(holder: ItemViewHolder) { + override fun registerListener(holder: ItemViewHolder, binding: ItemRssArticleBinding) { holder.itemView.onClick { getItem(holder.layoutPosition)?.let { callBack.readRss(it) diff --git a/app/src/main/java/io/legado/app/ui/rss/source/debug/RssSourceDebugAdapter.kt b/app/src/main/java/io/legado/app/ui/rss/source/debug/RssSourceDebugAdapter.kt index 3d5262db4..045cffeec 100644 --- a/app/src/main/java/io/legado/app/ui/rss/source/debug/RssSourceDebugAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/rss/source/debug/RssSourceDebugAdapter.kt @@ -5,29 +5,34 @@ import android.view.View import io.legado.app.R import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.SimpleRecyclerAdapter -import kotlinx.android.synthetic.main.item_log.view.* +import io.legado.app.databinding.ItemLogBinding class RssSourceDebugAdapter(context: Context) : - SimpleRecyclerAdapter(context, R.layout.item_log) { - override fun convert(holder: ItemViewHolder, item: String, payloads: MutableList) { - holder.itemView.apply { - if (text_view.getTag(R.id.tag1) == null) { + SimpleRecyclerAdapter(context) { + override fun convert( + holder: ItemViewHolder, + binding: ItemLogBinding, + item: String, + payloads: MutableList + ) { + binding.apply { + if (textView.getTag(R.id.tag1) == null) { val listener = object : View.OnAttachStateChangeListener { override fun onViewAttachedToWindow(v: View) { - text_view.isCursorVisible = false - text_view.isCursorVisible = true + textView.isCursorVisible = false + textView.isCursorVisible = true } override fun onViewDetachedFromWindow(v: View) {} } - text_view.addOnAttachStateChangeListener(listener) - text_view.setTag(R.id.tag1, listener) + textView.addOnAttachStateChangeListener(listener) + textView.setTag(R.id.tag1, listener) } - text_view.text = item + textView.text = item } } - override fun registerListener(holder: ItemViewHolder) { + override fun registerListener(holder: ItemViewHolder, binding: ItemLogBinding) { //nothing } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditAdapter.kt b/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditAdapter.kt index b467c9b48..96c71c8e6 100644 --- a/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditAdapter.kt @@ -7,7 +7,7 @@ import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import io.legado.app.R -import kotlinx.android.synthetic.main.item_source_edit.view.* +import io.legado.app.databinding.ItemSourceEditBinding class RssSourceEditAdapter : RecyclerView.Adapter() { @@ -18,11 +18,9 @@ class RssSourceEditAdapter : RecyclerView.Adapter() it.map { group -> @@ -77,16 +78,14 @@ class GroupManageDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener @SuppressLint("InflateParams") private fun addGroup() { alert(title = getString(R.string.add_group)) { - var editText: EditText? = null + val alertBinding = DialogEditTextBinding.inflate(layoutInflater) customView { - layoutInflater.inflate(R.layout.dialog_edit_text, null).apply { - editText = edit_view.apply { - hint = "分组名称" - } - } + alertBinding.apply { + editView.setHint(R.string.group_name) + }.root } yesButton { - editText?.text?.toString()?.let { + alertBinding.editView.text?.toString()?.let { if (it.isNotBlank()) { viewModel.addGroup(it) } @@ -99,40 +98,43 @@ class GroupManageDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener @SuppressLint("InflateParams") private fun editGroup(group: String) { alert(title = getString(R.string.group_edit)) { - var editText: EditText? = null + val alertBinding = DialogEditTextBinding.inflate(layoutInflater) customView { - layoutInflater.inflate(R.layout.dialog_edit_text, null).apply { - editText = edit_view.apply { - hint = "分组名称" - setText(group) - } - } + alertBinding.apply { + editView.setHint(R.string.group_name) + editView.setText(group) + }.root } yesButton { - viewModel.upGroup(group, editText?.text?.toString()) + viewModel.upGroup(group, alertBinding.editView.text?.toString()) } noButton() }.show().requestInputMethod() } private inner class GroupAdapter(context: Context) : - SimpleRecyclerAdapter(context, R.layout.item_group_manage) { + SimpleRecyclerAdapter(context) { - override fun convert(holder: ItemViewHolder, item: String, payloads: MutableList) { - with(holder.itemView) { - tv_group.text = item + override fun convert( + holder: ItemViewHolder, + binding: ItemGroupManageBinding, + item: String, + payloads: MutableList + ) { + with(binding) { + tvGroup.text = item } } - override fun registerListener(holder: ItemViewHolder) { - holder.itemView.apply { - tv_edit.onClick { + override fun registerListener(holder: ItemViewHolder, binding: ItemGroupManageBinding) { + binding.apply { + tvEdit.onClick { getItem(holder.layoutPosition)?.let { editGroup(it) } } - tv_del.onClick { + tvDel.onClick { getItem(holder.layoutPosition)?.let { viewModel.delGroup(it) } diff --git a/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceAdapter.kt b/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceAdapter.kt index acd7aa723..c3ee0ab72 100644 --- a/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceAdapter.kt @@ -10,15 +10,15 @@ import io.legado.app.R import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.SimpleRecyclerAdapter import io.legado.app.data.entities.RssSource +import io.legado.app.databinding.ItemRssSourceBinding import io.legado.app.lib.theme.backgroundColor import io.legado.app.ui.widget.recycler.DragSelectTouchHelper import io.legado.app.ui.widget.recycler.ItemTouchCallback -import kotlinx.android.synthetic.main.item_rss_source.view.* import org.jetbrains.anko.sdk27.listeners.onClick import java.util.* class RssSourceAdapter(context: Context, val callBack: CallBack) : - SimpleRecyclerAdapter(context, R.layout.item_rss_source), + SimpleRecyclerAdapter(context), ItemTouchCallback.Callback { private val selected = linkedSetOf() @@ -53,40 +53,45 @@ class RssSourceAdapter(context: Context, val callBack: CallBack) : return selection.sortedBy { it.customOrder } } - override fun convert(holder: ItemViewHolder, item: RssSource, payloads: MutableList) { - with(holder.itemView) { + override fun convert( + holder: ItemViewHolder, + binding: ItemRssSourceBinding, + item: RssSource, + payloads: MutableList + ) { + with(binding) { val bundle = payloads.getOrNull(0) as? Bundle if (bundle == null) { - this.setBackgroundColor(context.backgroundColor) + root.setBackgroundColor(context.backgroundColor) if (item.sourceGroup.isNullOrEmpty()) { - cb_source.text = item.sourceName + cbSource.text = item.sourceName } else { - cb_source.text = + cbSource.text = String.format("%s (%s)", item.sourceName, item.sourceGroup) } - swt_enabled.isChecked = item.enabled - cb_source.isChecked = selected.contains(item) + swtEnabled.isChecked = item.enabled + cbSource.isChecked = selected.contains(item) } else { bundle.keySet().map { when (it) { "name", "group" -> if (item.sourceGroup.isNullOrEmpty()) { - cb_source.text = item.sourceName + cbSource.text = item.sourceName } else { - cb_source.text = + cbSource.text = String.format("%s (%s)", item.sourceName, item.sourceGroup) } - "selected" -> cb_source.isChecked = selected.contains(item) - "enabled" -> swt_enabled.isChecked = item.enabled + "selected" -> cbSource.isChecked = selected.contains(item) + "enabled" -> cbSource.isChecked = item.enabled } } } } } - override fun registerListener(holder: ItemViewHolder) { - holder.itemView.apply { - swt_enabled.setOnCheckedChangeListener { view, checked -> + override fun registerListener(holder: ItemViewHolder, binding: ItemRssSourceBinding) { + binding.apply { + swtEnabled.setOnCheckedChangeListener { view, checked -> getItem(holder.layoutPosition)?.let { if (view.isPressed) { it.enabled = checked @@ -94,7 +99,7 @@ class RssSourceAdapter(context: Context, val callBack: CallBack) : } } } - cb_source.setOnCheckedChangeListener { view, checked -> + cbSource.setOnCheckedChangeListener { view, checked -> getItem(holder.layoutPosition)?.let { if (view.isPressed) { if (checked) { @@ -106,13 +111,13 @@ class RssSourceAdapter(context: Context, val callBack: CallBack) : } } } - iv_edit.onClick { + ivEdit.onClick { getItem(holder.layoutPosition)?.let { callBack.edit(it) } } - iv_menu_more.onClick { - showMenu(iv_menu_more, holder.layoutPosition) + ivMenuMore.onClick { + showMenu(ivMenuMore, holder.layoutPosition) } } } diff --git a/app/src/main/java/io/legado/app/ui/widget/KeyboardToolPop.kt b/app/src/main/java/io/legado/app/ui/widget/KeyboardToolPop.kt index 56dff107c..11d597911 100644 --- a/app/src/main/java/io/legado/app/ui/widget/KeyboardToolPop.kt +++ b/app/src/main/java/io/legado/app/ui/widget/KeyboardToolPop.kt @@ -1,17 +1,15 @@ package io.legado.app.ui.widget -import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.ViewGroup import android.widget.PopupWindow import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import io.legado.app.R import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.SimpleRecyclerAdapter -import kotlinx.android.synthetic.main.item_fillet_text.view.* -import kotlinx.android.synthetic.main.popup_keyboard_tool.view.* +import io.legado.app.databinding.ItemFilletTextBinding +import io.legado.app.databinding.PopupKeyboardToolBinding import org.jetbrains.anko.sdk27.listeners.onClick @@ -21,9 +19,10 @@ class KeyboardToolPop( val callBack: CallBack? ) : PopupWindow(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) { + private val binding = PopupKeyboardToolBinding.inflate(LayoutInflater.from(context)) + init { - @SuppressLint("InflateParams") - contentView = LayoutInflater.from(context).inflate(R.layout.popup_keyboard_tool, null) + contentView = binding.root isTouchable = true isOutsideTouchable = false @@ -34,21 +33,27 @@ class KeyboardToolPop( private fun initRecyclerView() = with(contentView) { val adapter = Adapter(context) - recycler_view.layoutManager = LinearLayoutManager(context, RecyclerView.HORIZONTAL, false) - recycler_view.adapter = adapter + binding.recyclerView.layoutManager = + LinearLayoutManager(context, RecyclerView.HORIZONTAL, false) + binding.recyclerView.adapter = adapter adapter.setItems(chars) } inner class Adapter(context: Context) : - SimpleRecyclerAdapter(context, R.layout.item_fillet_text) { + SimpleRecyclerAdapter(context) { - override fun convert(holder: ItemViewHolder, item: String, payloads: MutableList) { - with(holder.itemView) { - text_view.text = item + override fun convert( + holder: ItemViewHolder, + binding: ItemFilletTextBinding, + item: String, + payloads: MutableList + ) { + with(binding) { + textView.text = item } } - override fun registerListener(holder: ItemViewHolder) { + override fun registerListener(holder: ItemViewHolder, binding: ItemFilletTextBinding) { holder.itemView.apply { onClick { getItem(holder.layoutPosition)?.let { diff --git a/app/src/main/java/io/legado/app/ui/widget/SelectActionBar.kt b/app/src/main/java/io/legado/app/ui/widget/SelectActionBar.kt index 3fc481e8b..316f4102c 100644 --- a/app/src/main/java/io/legado/app/ui/widget/SelectActionBar.kt +++ b/app/src/main/java/io/legado/app/ui/widget/SelectActionBar.kt @@ -2,18 +2,18 @@ package io.legado.app.ui.widget import android.content.Context import android.util.AttributeSet +import android.view.LayoutInflater import android.view.Menu -import android.view.View import android.widget.FrameLayout import androidx.annotation.MenuRes import androidx.annotation.StringRes import androidx.appcompat.widget.PopupMenu import io.legado.app.R +import io.legado.app.databinding.ViewSelectActionBarBinding import io.legado.app.help.AppConfig import io.legado.app.lib.theme.* import io.legado.app.utils.ColorUtils import io.legado.app.utils.visible -import kotlinx.android.synthetic.main.view_select_action_bar.view.* import org.jetbrains.anko.sdk27.listeners.onClick @Suppress("unused") @@ -23,42 +23,43 @@ class SelectActionBar @JvmOverloads constructor( ) : FrameLayout(context, attrs) { private var callBack: CallBack? = null private var selMenu: PopupMenu? = null + private val binding = + ViewSelectActionBarBinding.inflate(LayoutInflater.from(context), this, true) init { setBackgroundColor(context.bottomBackground) elevation = if (AppConfig.elevation < 0) context.elevation else AppConfig.elevation.toFloat() - View.inflate(context, R.layout.view_select_action_bar, this) val textIsDark = ColorUtils.isColorLight(context.bottomBackground) val primaryTextColor = context.getPrimaryTextColor(textIsDark) val secondaryTextColor = context.getSecondaryTextColor(textIsDark) - cb_selected_all.setTextColor(primaryTextColor) - TintHelper.setTint(cb_selected_all, context.accentColor, !textIsDark) - iv_menu_more.setColorFilter(secondaryTextColor) - cb_selected_all.setOnCheckedChangeListener { buttonView, isChecked -> + binding.cbSelectedAll.setTextColor(primaryTextColor) + TintHelper.setTint(binding.cbSelectedAll, context.accentColor, !textIsDark) + binding.ivMenuMore.setColorFilter(secondaryTextColor) + binding.cbSelectedAll.setOnCheckedChangeListener { buttonView, isChecked -> if (buttonView.isPressed) { callBack?.selectAll(isChecked) } } - btn_revert_selection.onClick { callBack?.revertSelection() } - btn_select_action_main.onClick { callBack?.onClickMainAction() } - iv_menu_more.onClick { selMenu?.show() } + binding.btnRevertSelection.onClick { callBack?.revertSelection() } + binding.btnSelectActionMain.onClick { callBack?.onClickMainAction() } + binding.ivMenuMore.onClick { selMenu?.show() } } - fun setMainActionText(text: String) { - btn_select_action_main.text = text - btn_select_action_main.visible() + fun setMainActionText(text: String) = with(binding) { + btnSelectActionMain.text = text + btnSelectActionMain.visible() } - fun setMainActionText(@StringRes id: Int) { - btn_select_action_main.setText(id) - btn_select_action_main.visible() + fun setMainActionText(@StringRes id: Int) = with(binding) { + btnSelectActionMain.setText(id) + btnSelectActionMain.visible() } fun inflateMenu(@MenuRes resId: Int): Menu? { - selMenu = PopupMenu(context, iv_menu_more) + selMenu = PopupMenu(context, binding.ivMenuMore) selMenu?.inflate(resId) - iv_menu_more.visible() + binding.ivMenuMore.visible() return selMenu?.menu } @@ -70,22 +71,22 @@ class SelectActionBar @JvmOverloads constructor( selMenu?.setOnMenuItemClickListener(listener) } - fun upCountView(selectCount: Int, allCount: Int) { + fun upCountView(selectCount: Int, allCount: Int) = with(binding) { if (selectCount == 0) { - cb_selected_all.isChecked = false + cbSelectedAll.isChecked = false } else { - cb_selected_all.isChecked = selectCount >= allCount + cbSelectedAll.isChecked = selectCount >= allCount } //重置全选的文字 - if (cb_selected_all.isChecked) { - cb_selected_all.text = context.getString( + if (cbSelectedAll.isChecked) { + cbSelectedAll.text = context.getString( R.string.select_cancel_count, selectCount, allCount ) } else { - cb_selected_all.text = context.getString( + cbSelectedAll.text = context.getString( R.string.select_all_count, selectCount, allCount @@ -94,11 +95,11 @@ class SelectActionBar @JvmOverloads constructor( setMenuClickable(selectCount > 0) } - private fun setMenuClickable(isClickable: Boolean) { - btn_revert_selection.isEnabled = isClickable - btn_revert_selection.isClickable = isClickable - btn_select_action_main.isEnabled = isClickable - btn_select_action_main.isClickable = isClickable + private fun setMenuClickable(isClickable: Boolean) = with(binding) { + btnRevertSelection.isEnabled = isClickable + btnRevertSelection.isClickable = isClickable + btnSelectActionMain.isEnabled = isClickable + btnSelectActionMain.isClickable = isClickable } interface CallBack { diff --git a/app/src/main/java/io/legado/app/ui/widget/dialog/PhotoDialog.kt b/app/src/main/java/io/legado/app/ui/widget/dialog/PhotoDialog.kt index 306b56ff1..7855856f4 100644 --- a/app/src/main/java/io/legado/app/ui/widget/dialog/PhotoDialog.kt +++ b/app/src/main/java/io/legado/app/ui/widget/dialog/PhotoDialog.kt @@ -7,9 +7,10 @@ import android.view.ViewGroup import androidx.fragment.app.FragmentManager import io.legado.app.R import io.legado.app.base.BaseDialogFragment +import io.legado.app.databinding.DialogPhotoViewBinding import io.legado.app.service.help.ReadBook import io.legado.app.ui.book.read.page.provider.ImageProvider -import kotlinx.android.synthetic.main.dialog_photo_view.* +import io.legado.app.utils.viewbindingdelegate.viewBinding class PhotoDialog : BaseDialogFragment() { @@ -31,6 +32,8 @@ class PhotoDialog : BaseDialogFragment() { } + private val binding by viewBinding(DialogPhotoViewBinding::bind) + override fun onStart() { super.onStart() dialog?.window?.setLayout( @@ -57,7 +60,7 @@ class PhotoDialog : BaseDialogFragment() { ImageProvider.getImage(book, chapterIndex, src) }.onSuccess { bitmap -> if (bitmap != null) { - photo_view.setImageBitmap(bitmap) + binding.photoView.setImageBitmap(bitmap) } } } diff --git a/app/src/main/java/io/legado/app/ui/widget/dialog/TextDialog.kt b/app/src/main/java/io/legado/app/ui/widget/dialog/TextDialog.kt index b74b85c07..ea4330039 100644 --- a/app/src/main/java/io/legado/app/ui/widget/dialog/TextDialog.kt +++ b/app/src/main/java/io/legado/app/ui/widget/dialog/TextDialog.kt @@ -7,10 +7,11 @@ import android.view.ViewGroup import androidx.fragment.app.FragmentManager import io.legado.app.R import io.legado.app.base.BaseDialogFragment +import io.legado.app.databinding.DialogTextViewBinding import io.legado.app.utils.getSize +import io.legado.app.utils.viewbindingdelegate.viewBinding import io.noties.markwon.Markwon import io.noties.markwon.image.glide.GlideImagesPlugin -import kotlinx.android.synthetic.main.dialog_text_view.* import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -40,8 +41,8 @@ class TextDialog : BaseDialogFragment() { } + private val binding by viewBinding(DialogTextViewBinding::bind) private var time = 0L - private var autoClose: Boolean = false override fun onStart() { @@ -62,23 +63,23 @@ class TextDialog : BaseDialogFragment() { arguments?.let { val content = it.getString("content") ?: "" when (it.getInt("mode")) { - MD -> text_view.post { + MD -> binding.textView.post { Markwon.builder(requireContext()) .usePlugin(GlideImagesPlugin.create(requireContext())) .build() - .setMarkdown(text_view, content) + .setMarkdown(binding.textView, content) } - else -> text_view.text = content + else -> binding.textView.text = content } time = it.getLong("time", 0L) } if (time > 0) { - badge_view.setBadgeCount((time / 1000).toInt()) + binding.badgeView.setBadgeCount((time / 1000).toInt()) launch { while (time > 0) { delay(1000) time -= 1000 - badge_view.setBadgeCount((time / 1000).toInt()) + binding.badgeView.setBadgeCount((time / 1000).toInt()) if (time <= 0) { view.post { dialog?.setCancelable(true) diff --git a/app/src/main/java/io/legado/app/ui/widget/dialog/TextListDialog.kt b/app/src/main/java/io/legado/app/ui/widget/dialog/TextListDialog.kt index 4d5d48620..6f110ae56 100644 --- a/app/src/main/java/io/legado/app/ui/widget/dialog/TextListDialog.kt +++ b/app/src/main/java/io/legado/app/ui/widget/dialog/TextListDialog.kt @@ -11,9 +11,10 @@ import io.legado.app.R import io.legado.app.base.BaseDialogFragment import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.SimpleRecyclerAdapter +import io.legado.app.databinding.DialogRecyclerViewBinding +import io.legado.app.databinding.ItemLogBinding import io.legado.app.utils.getSize -import kotlinx.android.synthetic.main.dialog_recycler_view.* -import kotlinx.android.synthetic.main.item_log.view.* +import io.legado.app.utils.viewbindingdelegate.viewBinding class TextListDialog : BaseDialogFragment() { @@ -28,8 +29,9 @@ class TextListDialog : BaseDialogFragment() { } } + private val binding by viewBinding(DialogRecyclerViewBinding::bind) lateinit var adapter: TextAdapter - var values: ArrayList? = null + private var values: ArrayList? = null override fun onStart() { super.onStart() @@ -45,38 +47,44 @@ class TextListDialog : BaseDialogFragment() { return inflater.inflate(R.layout.dialog_recycler_view, container) } - override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { + override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) = with(binding) { arguments?.let { - tool_bar.title = it.getString("title") + toolBar.title = it.getString("title") values = it.getStringArrayList("values") } - recycler_view.layoutManager = LinearLayoutManager(requireContext()) + recyclerView.layoutManager = LinearLayoutManager(requireContext()) adapter = TextAdapter(requireContext()) - recycler_view.adapter = adapter + recyclerView.adapter = adapter adapter.setItems(values) } class TextAdapter(context: Context) : - SimpleRecyclerAdapter(context, R.layout.item_log) { - override fun convert(holder: ItemViewHolder, item: String, payloads: MutableList) { - holder.itemView.apply { - if (text_view.getTag(R.id.tag1) == null) { + SimpleRecyclerAdapter(context) { + + override fun convert( + holder: ItemViewHolder, + binding: ItemLogBinding, + item: String, + payloads: MutableList + ) { + binding.apply { + if (textView.getTag(R.id.tag1) == null) { val listener = object : View.OnAttachStateChangeListener { override fun onViewAttachedToWindow(v: View) { - text_view.isCursorVisible = false - text_view.isCursorVisible = true + textView.isCursorVisible = false + textView.isCursorVisible = true } override fun onViewDetachedFromWindow(v: View) {} } - text_view.addOnAttachStateChangeListener(listener) - text_view.setTag(R.id.tag1, listener) + textView.addOnAttachStateChangeListener(listener) + textView.setTag(R.id.tag1, listener) } - text_view.text = item + textView.text = item } } - override fun registerListener(holder: ItemViewHolder) { + override fun registerListener(holder: ItemViewHolder, binding: ItemLogBinding) { //nothing } } diff --git a/app/src/main/java/io/legado/app/ui/widget/dynamiclayout/DynamicFrameLayout.kt b/app/src/main/java/io/legado/app/ui/widget/dynamiclayout/DynamicFrameLayout.kt index d3115bdc9..c2a45147f 100644 --- a/app/src/main/java/io/legado/app/ui/widget/dynamiclayout/DynamicFrameLayout.kt +++ b/app/src/main/java/io/legado/app/ui/widget/dynamiclayout/DynamicFrameLayout.kt @@ -4,13 +4,13 @@ import android.content.Context import android.graphics.drawable.Drawable import android.util.AttributeSet import android.view.View +import android.view.ViewStub import android.widget.FrameLayout import android.widget.ProgressBar import androidx.appcompat.widget.AppCompatButton import androidx.appcompat.widget.AppCompatImageView import androidx.appcompat.widget.AppCompatTextView import io.legado.app.R -import kotlinx.android.synthetic.main.view_dynamic.view.* @Suppress("unused") class DynamicFrameLayout @JvmOverloads constructor( @@ -150,7 +150,7 @@ class DynamicFrameLayout @JvmOverloads constructor( private fun ensureErrorView() { if (errorView == null) { - errorView = errorViewStub.inflate() + errorView = findViewById(R.id.error_view_stub).inflate() errorImage = errorView?.findViewById(R.id.iv_error_image) errorTextView = errorView?.findViewById(R.id.tv_error_message) actionBtn = errorView?.findViewById(R.id.btn_error_retry) @@ -166,7 +166,7 @@ class DynamicFrameLayout @JvmOverloads constructor( private fun ensureProgressView() { if (progressView == null) { - progressView = progressViewStub.inflate() + progressView = findViewById(R.id.progress_view_stub).inflate() progressBar = progressView?.findViewById(R.id.loading_progress) } } diff --git a/app/src/main/java/io/legado/app/ui/widget/font/FontAdapter.kt b/app/src/main/java/io/legado/app/ui/widget/font/FontAdapter.kt index a54ee0182..dab430029 100644 --- a/app/src/main/java/io/legado/app/ui/widget/font/FontAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/widget/font/FontAdapter.kt @@ -3,23 +3,27 @@ package io.legado.app.ui.widget.font import android.content.Context import android.graphics.Typeface import android.os.Build -import io.legado.app.R import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.SimpleRecyclerAdapter +import io.legado.app.databinding.ItemFontBinding import io.legado.app.utils.DocItem import io.legado.app.utils.RealPathUtil import io.legado.app.utils.invisible import io.legado.app.utils.visible -import kotlinx.android.synthetic.main.item_font.view.* import org.jetbrains.anko.sdk27.listeners.onClick import org.jetbrains.anko.toast import java.io.File class FontAdapter(context: Context, val callBack: CallBack) : - SimpleRecyclerAdapter(context, R.layout.item_font) { + SimpleRecyclerAdapter(context) { - override fun convert(holder: ItemViewHolder, item: DocItem, payloads: MutableList) { - with(holder.itemView) { + override fun convert( + holder: ItemViewHolder, + binding: ItemFontBinding, + item: DocItem, + payloads: MutableList + ) { + with(binding) { try { val typeface: Typeface? = if (item.isContentPath) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { @@ -34,22 +38,22 @@ class FontAdapter(context: Context, val callBack: CallBack) : } else { Typeface.createFromFile(item.uri.toString()) } - tv_font.typeface = typeface + tvFont.typeface = typeface } catch (e: Exception) { e.printStackTrace() context.toast("Read ${item.name} Error: ${e.localizedMessage}") } - tv_font.text = item.name - this.onClick { callBack.onClick(item) } + tvFont.text = item.name + root.onClick { callBack.onClick(item) } if (item.name == callBack.curFilePath.substringAfterLast(File.separator)) { - iv_checked.visible() + ivChecked.visible() } else { - iv_checked.invisible() + ivChecked.invisible() } } } - override fun registerListener(holder: ItemViewHolder) { + override fun registerListener(holder: ItemViewHolder, binding: ItemFontBinding) { holder.itemView.onClick { getItem(holder.layoutPosition)?.let { callBack.onClick(it) diff --git a/app/src/main/java/io/legado/app/ui/widget/font/FontSelectDialog.kt b/app/src/main/java/io/legado/app/ui/widget/font/FontSelectDialog.kt index 3c4716d56..65c99b66f 100644 --- a/app/src/main/java/io/legado/app/ui/widget/font/FontSelectDialog.kt +++ b/app/src/main/java/io/legado/app/ui/widget/font/FontSelectDialog.kt @@ -15,6 +15,7 @@ import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseDialogFragment import io.legado.app.constant.PreferKey +import io.legado.app.databinding.DialogFontSelectBinding import io.legado.app.help.AppConfig import io.legado.app.help.permission.Permissions import io.legado.app.help.permission.PermissionsCompat @@ -23,7 +24,7 @@ import io.legado.app.lib.theme.primaryColor import io.legado.app.ui.filepicker.FilePicker import io.legado.app.ui.filepicker.FilePickerDialog import io.legado.app.utils.* -import kotlinx.android.synthetic.main.dialog_font_select.* +import io.legado.app.utils.viewbindingdelegate.viewBinding import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.launch import java.io.File @@ -40,6 +41,7 @@ class FontSelectDialog : BaseDialogFragment(), FileUtils.createFolderIfNotExist(App.INSTANCE.filesDir, "Fonts") } private var adapter: FontAdapter? = null + private val binding by viewBinding(DialogFontSelectBinding::bind) override fun onStart() { super.onStart() @@ -56,14 +58,14 @@ class FontSelectDialog : BaseDialogFragment(), } override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { - tool_bar.setBackgroundColor(primaryColor) - tool_bar.setTitle(R.string.select_font) - tool_bar.inflateMenu(R.menu.font_select) - tool_bar.menu.applyTint(requireContext()) - tool_bar.setOnMenuItemClickListener(this) + binding.toolBar.setBackgroundColor(primaryColor) + binding.toolBar.setTitle(R.string.select_font) + binding.toolBar.inflateMenu(R.menu.font_select) + binding.toolBar.menu.applyTint(requireContext()) + binding.toolBar.setOnMenuItemClickListener(this) adapter = FontAdapter(requireContext(), this) - recycler_view.layoutManager = LinearLayoutManager(context) - recycler_view.adapter = adapter + binding.recyclerView.layoutManager = LinearLayoutManager(context) + binding.recyclerView.adapter = adapter val fontPath = getPrefString(PreferKey.fontFolder) if (fontPath.isNullOrEmpty()) { diff --git a/app/src/main/java/io/legado/app/ui/widget/number/NumberPickerDialog.kt b/app/src/main/java/io/legado/app/ui/widget/number/NumberPickerDialog.kt index 91dd8ffa3..01e11efad 100644 --- a/app/src/main/java/io/legado/app/ui/widget/number/NumberPickerDialog.kt +++ b/app/src/main/java/io/legado/app/ui/widget/number/NumberPickerDialog.kt @@ -6,7 +6,6 @@ import androidx.appcompat.app.AlertDialog import io.legado.app.R import io.legado.app.utils.applyTint import io.legado.app.utils.hideSoftInput -import kotlinx.android.synthetic.main.dialog_number_picker.* class NumberPickerDialog(context: Context) { @@ -61,7 +60,7 @@ class NumberPickerDialog(context: Context) { } builder.setNegativeButton(R.string.cancel, null) val dialog = builder.show().applyTint() - numberPicker = dialog.number_picker + numberPicker = dialog.findViewById(R.id.number_picker) numberPicker?.let { np -> minValue?.let { np.minValue = it diff --git a/app/src/main/java/io/legado/app/ui/widget/prefs/IconListPreference.kt b/app/src/main/java/io/legado/app/ui/widget/prefs/IconListPreference.kt index a86861006..6c2676467 100644 --- a/app/src/main/java/io/legado/app/ui/widget/prefs/IconListPreference.kt +++ b/app/src/main/java/io/legado/app/ui/widget/prefs/IconListPreference.kt @@ -17,11 +17,12 @@ import io.legado.app.R import io.legado.app.base.BaseDialogFragment import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.SimpleRecyclerAdapter +import io.legado.app.databinding.DialogRecyclerViewBinding +import io.legado.app.databinding.ItemIconPreferenceBinding import io.legado.app.lib.theme.primaryColor import io.legado.app.utils.getCompatDrawable import io.legado.app.utils.getSize -import kotlinx.android.synthetic.main.dialog_recycler_view.* -import kotlinx.android.synthetic.main.item_icon_preference.view.* +import io.legado.app.utils.viewbindingdelegate.viewBinding import org.jetbrains.anko.sdk27.listeners.onClick @@ -117,6 +118,7 @@ class IconListPreference(context: Context, attrs: AttributeSet) : ListPreference var dialogEntries: Array? = null var dialogEntryValues: Array? = null var dialogIconNames: Array? = null + private val binding by viewBinding(DialogRecyclerViewBinding::bind) override fun onStart() { super.onStart() @@ -136,11 +138,11 @@ class IconListPreference(context: Context, attrs: AttributeSet) : ListPreference } override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { - tool_bar.setBackgroundColor(primaryColor) - tool_bar.setTitle(R.string.change_icon) - recycler_view.layoutManager = LinearLayoutManager(requireContext()) + binding.toolBar.setBackgroundColor(primaryColor) + binding.toolBar.setTitle(R.string.change_icon) + binding.recyclerView.layoutManager = LinearLayoutManager(requireContext()) val adapter = Adapter(requireContext()) - recycler_view.adapter = adapter + binding.recyclerView.adapter = adapter arguments?.let { dialogValue = it.getString("value") dialogEntries = it.getCharSequenceArray("entries") @@ -154,14 +156,15 @@ class IconListPreference(context: Context, attrs: AttributeSet) : ListPreference inner class Adapter(context: Context) : - SimpleRecyclerAdapter(context, R.layout.item_icon_preference) { + SimpleRecyclerAdapter(context) { override fun convert( holder: ItemViewHolder, + binding: ItemIconPreferenceBinding, item: CharSequence, payloads: MutableList ) { - with(holder.itemView) { + with(binding) { val index = findIndexOfValue(item.toString()) dialogEntries?.let { label.text = it[index] @@ -179,14 +182,17 @@ class IconListPreference(context: Context, attrs: AttributeSet) : ListPreference } } label.isChecked = item.toString() == dialogValue - onClick { + root.onClick { onChanged?.invoke(item.toString()) this@IconDialog.dismiss() } } } - override fun registerListener(holder: ItemViewHolder) { + override fun registerListener( + holder: ItemViewHolder, + binding: ItemIconPreferenceBinding + ) { holder.itemView.onClick { getItem(holder.layoutPosition)?.let { onChanged?.invoke(it.toString()) diff --git a/app/src/main/java/io/legado/app/ui/widget/text/AutoCompleteTextView.kt b/app/src/main/java/io/legado/app/ui/widget/text/AutoCompleteTextView.kt index cff5714f4..9e9153e71 100644 --- a/app/src/main/java/io/legado/app/ui/widget/text/AutoCompleteTextView.kt +++ b/app/src/main/java/io/legado/app/ui/widget/text/AutoCompleteTextView.kt @@ -8,12 +8,13 @@ import android.view.MotionEvent import android.view.View import android.view.ViewGroup import android.widget.ArrayAdapter +import android.widget.ImageView +import android.widget.TextView import androidx.appcompat.widget.AppCompatAutoCompleteTextView import io.legado.app.R import io.legado.app.lib.theme.ATH import io.legado.app.utils.gone import io.legado.app.utils.visible -import kotlinx.android.synthetic.main.item_1line_text_and_del.view.* import org.jetbrains.anko.sdk27.listeners.onClick @Suppress("unused") @@ -56,9 +57,11 @@ class AutoCompleteTextView @JvmOverloads constructor( override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { val view = convertView ?: LayoutInflater.from(context) .inflate(R.layout.item_1line_text_and_del, parent, false) - view.text_view.text = getItem(position) - if (delCallBack != null) view.iv_delete.visible() else view.iv_delete.gone() - view.iv_delete.onClick { + val textView = view.findViewById(R.id.text_view) + textView.text = getItem(position) + val ivDelete = view.findViewById(R.id.iv_delete) + if (delCallBack != null) ivDelete.visible() else ivDelete.gone() + ivDelete.onClick { getItem(position)?.let { remove(it) delCallBack?.invoke(it) diff --git a/app/src/main/res/layout/view_dynamic.xml b/app/src/main/res/layout/view_dynamic.xml index e94e2eaca..3602c6392 100644 --- a/app/src/main/res/layout/view_dynamic.xml +++ b/app/src/main/res/layout/view_dynamic.xml @@ -4,14 +4,14 @@ android:layout_height="match_parent">