Я сделал свой школьный проект и столкнулся с проблемой.
Есть приложение, в котором есть два фрагмента.Один с RecyclerView, в котором есть список элементов, а второй фрагмент открывает детали выбранного элемента.
Когда я нажимаю кнопку возврата на экране с подробностями, первый фрагмент мигает на мгновение, и все.Я посмотрел на Logcat, оказалось, что второй фрагмент постоянно воссоздается.Я сам пытался найти причину, но не смог.
Классы большие, я не знаю, что вам показать, может быть, влияет каждая мелочь.Я буду прикреплять ссылки на классы:
MainActivity.class
class MainActivity : MvpAppCompatActivity(), MainActivityView {
@InjectPresenter
lateinit var presenter: MainActivityPresenter
lateinit var fm : FragmentManager
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main_activity)
fm = supportFragmentManager
nav_bottom.setOnNavigationItemSelectedListener { item ->
when(item.itemId){
R.id.nav_list -> {
fm.beginTransaction()
.replace(R.id.fragment_container, AllCharactersListFragment.newInstance())
.addToBackStack(null).commit()
true
}
R.id.nav_favourites -> {
fm.beginTransaction()
.replace(R.id.fragment_container, FavouriteListFragment.newInstance())
.addToBackStack(null).commit()
true
}
R.id.nav_search -> {
fm.beginTransaction()
.replace(R.id.fragment_container, SearchCharacterFragment.newInstance())
.addToBackStack(null).commit()
true
}
else -> false
}
}
}
override fun setFirstFragment() {
fm.beginTransaction()
.replace(R.id.fragment_container, AllCharactersListFragment.newInstance())
.commit()
}
AllCharactersListFragment.class
class AllCharactersListFragment : MvpAppCompatFragment(), AllCharactersFragmentView {
@Inject
lateinit var apiService : RetrofitService
@Inject
lateinit var repository: Repository
@InjectPresenter
lateinit var presenter: AllCharacterPresenter
@ProvidePresenter
fun provideAllPresenter(): AllCharacterPresenter{
return AllCharacterPresenter(repository, apiService)
}
var isLastPage = false
var isLoading = false
private lateinit var mAdapter : CharacterAdapter
private lateinit var progress : ProgressBar
companion object {
fun newInstance(): AllCharactersListFragment = AllCharactersListFragment()
}
override fun onAttach(context: Context) {
super.onAttach(context)
val component = DaggerAppComponent.builder().netModule(NetModule()).appModule(AppModule(context)).roomModule(
RoomModule()).build()
component.inject(this)
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.all_characters, container, false)
val myRecyclerView = view.findViewById(R.id.character_list) as RecyclerView
progress = view.findViewById(R.id.progressBar) as ProgressBar
val layoutManager = LinearLayoutManager(activity)
myRecyclerView.layoutManager = layoutManager
mAdapter = CharacterAdapter(presenter)
presenter.loadFirstCharacters()
myRecyclerView.addOnScrollListener(object :
PaginationScrollListener(layoutManager) {
override fun isLastPage(): Boolean {
return isLastPage
}
override fun isLoading(): Boolean {
return isLoading
}
override fun loadMoreItems() {
isLoading = true
presenter.paginate()
Log.d("potok", "poshol")
}
})
myRecyclerView.adapter = mAdapter
return view
}
override fun onGetDataSuccess(list: List<Character>) {
mAdapter.addItems(list)
}
override fun showDetails(character : Character){
fragmentManager!!.beginTransaction()
.replace(R.id.fragment_container, FavouriteListFragment.newInstance())
.addToBackStack(null).commit()
}
override fun hideProgress() {
progress.visibility = View.INVISIBLE
isLoading = false
}
override fun showProgress() {
progress.visibility = View.VISIBLE
}
override fun onDestroy() {
mAdapter.clear()
super.onDestroy()
}
DetailFragment.class
class DetailFragment : MvpAppCompatFragment(), DetailFragmentView {
@Inject
lateinit var characterRepository : Repository
val TAG_CHARACTER = "DETAILS"
lateinit var character : Character
@InjectPresenter
lateinit var presenter : DetailPresenter
@ProvidePresenter
fun providePresenter(): DetailPresenter {
return DetailPresenter(repository = characterRepository)
}
companion object {
fun newInstance(character: Character) : DetailFragment {
val fragment = DetailFragment()
val args = Bundle()
args.putSerializable("DETAILS", character)
fragment.arguments = args
return fragment
}
}
override fun onAttach(context: Context) {
super.onAttach(context)
arguments?.getSerializable(TAG_CHARACTER)?.let { character = it as Character }
val component = DaggerAppComponent.builder().appModule(AppModule(activity!!.applicationContext)).roomModule(RoomModule()).build()
component.inject(this)
Log.d("test", "$character")
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val v = inflater.inflate(R.layout.detail_character, container, false)
presenter.init()
val favButton = v.findViewById(R.id.star_button) as ImageButton
val backButton = v.findViewById(R.id.back_button) as ImageButton
favButton.setOnClickListener{ if (!character.isFavourite) {
presenter.addToFavourite(character)
} else {
presenter.removeFromFavourite(character)
}
}
backButton.setOnClickListener {fragmentManager!!.popBackStackImmediate() }
Log.d("loop", "Created again")
return v
}
override fun initDetails() {
name_text.text = character.name
gender_text.text = character.gender
when {
character.gender == "female" -> gender_image.setImageResource(R.drawable.ic_female_gender)
character.gender == "n/a" -> gender_image.setImageResource(R.drawable.ic_na_gender)
character.gender == "hermaphrodite" -> gender_image.setImageResource(R.drawable.ic_hermophrod_gender)
character.gender == "male" -> gender_image.setImageResource(R.drawable.ic_male_gender)
}
height_text.text = character.height
mass_text.text = character.mass
year_text.text = character.birth_year
if (character.isFavourite) star_button.setImageResource(R.drawable.ic_fill_favourite)
}
override fun addFavourite() {
star_button.setImageResource(R.drawable.ic_fill_favourite)
character.isFavourite = true
Toast.makeText(context,"Add to favorite",Toast.LENGTH_SHORT).show()
}
override fun removeFavourite() {
star_button.setImageResource(R.drawable.ic_hollow_favourite)
Toast.makeText(context, "Remove to favorite", Toast.LENGTH_SHORT).show()
}