Android - фрагмент, вызываемый нижними навигационными вкладками, перезагружается каждый раз - PullRequest
0 голосов
/ 02 мая 2018

Я создаю проект, который использует нижнюю навигацию. Я использую фрагмент для вызова вкладок

val transaction = supportFragmentManager.beginTransaction()
transaction.add(R.id.frame_layout, Fragment1.newInstance(),Fragment1.newInstance().TAG)
transaction.addToBackStack(null).commit()

bottomNavigationView.setOnNavigationItemSelectedListener(object : BottomNavigationView.OnNavigationItemSelectedListener {

        override fun onNavigationItemSelected(item: MenuItem): Boolean {

            if(item.itemId == lastSelectedItemId){
                return true
            }

            var menuTag:String ?= null
            var selectedFragment: Fragment? = null
            lastSelectedItemId = item.itemId

            when (item.itemId) {
                R.id.tab1 -> {
                    selectedFragment = Fragment1.newInstance()
                    menuTag = selectedFragment.TAG
                }
                R.id.tab2 -> {
                    selectedFragment = Fragment2.newInstance()
                    menuTag = selectedFragment.TAG
                }
                R.id.tab3 -> {
                    selectedFragment = Fragment3.newInstance()
                    menuTag = selectedFragment.TAG
                }
                R.id.tab4 ->{
                    selectedFragment = Fragment4.newInstance()
                    menuTag = selectedFragment.TAG
                }
            }

            val transaction = supportFragmentManager.beginTransaction()
            transaction.replace(R.id.frame_layout, selectedFragment,menuTag)
            transaction.addToBackStack(menuTag).commit()
            return true
        }
    })

Но фрагмент всегда перезагружается Я устал какой-то метод

  1. заменить (). AddToBackStack (нуль)
  2. заменить (). AddToBackStack (тэг)
  3. добавить, скрыть, показать

addToBackStack () - при использовании этого, когда я нажимал на нижнюю кнопку «Назад» на андроиде по умолчанию, это портит мой макет фрагмента. то же самое с return @ OnNavigationItemSelectedListener true

Я следил за многими форумами, связанными с этой проблемой, но в моем случае ничего не работает.

Мой четвертый фрагмент -

class Fragment4 : Fragment() {

var listOfMoreMenus = ArrayList<MoreLinksObject>()
var adapter: MoreLinksAdapter?=null
public var TAG: String = "more"
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
}

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                          savedInstanceState: Bundle?): View? {
    val moreView = inflater.inflate(R.layout.fragment_more, container, false)
    val listView = moreView.findViewById(R.id.moreLinks) as ListView

    listOfMoreMenus.add(MoreLinksObject("test1","link1")) 
    listOfMoreMenus.add(MoreLinksObject("test2","link2")) 
    listOfMoreMenus.add(MoreLinksObject("test3","link3")) 
    listView.setNestedScrollingEnabled(true)
    adapter = MoreLinksAdapter(getActivity()!!,listOfMoreMenus)
    listView.adapter = adapter
    return moreView

}

companion object {
    fun newInstance(): Fragment4 {
        return Fragment4()
    }
}


inner class MoreLinksAdapter: BaseAdapter {

    var  listOfMoreMenus= ArrayList<MoreLinksObject>()
    var context: Context?=null
    constructor(context:Context, listOfMoreMenus: ArrayList<MoreLinksObject>):super(){
        this.listOfMoreMenus=listOfMoreMenus
        this.context=context

    }

    override fun getItem(position: Int): Any {
        return listOfMoreMenus[position]
    }

    override fun getItemId(position: Int): Long {
        return position.toLong()
    }

    override fun getCount(): Int {
        return  listOfMoreMenus.size
    }

    override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
        val MoreLinkObj =  listOfMoreMenus[position]
        var inflator = context!!.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
        var myView = inflator.inflate(R.layout.more_menu, null)
        val moreMenuName = myView.findViewById(R.id.moreMenuName) as TextView
        moreMenuName.text =  MoreLinkObj.name!!
        return myView
    }

}
}

1 Ответ

0 голосов
/ 02 мая 2018

Итак, вы предоставляете новый экземпляр, каждый раз вызывая newInstance() каждого фрагмента при каждом выборе опции. У вас есть два варианта здесь:

1) Массив фрагментов

Сохраняйте свои фрагменты в глобальном массиве при их создании и просто используйте его повторно

2) Tag

Добавьте тег к фрагменту и используйте его, чтобы найти тот же фрагмент позже.

Поскольку вы уже устанавливаете теги, которые лучше всего подходят для вас:

val FRAGMENT_1_TAG =  "FRAGMENT_1_TAG"
val FRAGMENT_2_TAG =  "FRAGMENT_2_TAG"
val FRAGMENT_3_TAG =  "FRAGMENT_3_TAG"
val FRAGMENT_4_TAG =  "FRAGMENT_4_TAG"

when (item.itemId) {
                R.id.tab1 -> {
                title = "Fragment1"
                selectedFragment = supportFragmentManager.findFragmentByTag(FRAGMENT_1_TAG);
                if (selectedFragment == null) {
                    selectedFragment = Fragment1.newInstance()
                }
                menuTag = FRAGMENT_1_TAG
                }
                R.id.tab2 -> {
                title = "Fragment2"
                selectedFragment = supportFragmentManager.findFragmentByTag(FRAGMENT_2_TAG);
                if (selectedFragment == null) {
                    selectedFragment = Fragment2.newInstance()
                }
                    menuTag = FRAGMENT_2_TAG
                }
                R.id.tab3 -> {
                title = "Fragment3"
                selectedFragment = supportFragmentManager.findFragmentByTag(FRAGMENT_3_TAG);
                if (selectedFragment == null) {
                    selectedFragment = Fragment3.newInstance()
                }
                    menuTag = FRAGMENT_3_TAG
                }
                R.id.tab4 ->{
                title = "Fragment4"
                selectedFragment = supportFragmentManager.findFragmentByTag(FRAGMENT_4_TAG);
                if (selectedFragment == null) {
                    selectedFragment = Fragment4.newInstance()
                }
                    menuTag = FRAGMENT_4_TAG
                }
            }

EDIT:

Чтобы очистить представление списка, вы можете просто очистить его перед добавлением нового контента, поэтому при каждом вызове onCreateView ваш список будет инициализироваться с нуля:

listOfMoreMenus.clear()
listOfMoreMenus.add(MoreLinksObject("test1","link1")) 
listOfMoreMenus.add(MoreLinksObject("test2","link2")) 
listOfMoreMenus.add(MoreLinksObject("test3","link3")) 

Что касается изменения заголовка, если ваша панель инструментов относится к занятию, вы можете устанавливать заголовок при каждом изменении фрагментов (см. Выше). Если он принадлежит фрагменту, вам нужно изменить его в методе onCreateView, чтобы он изменялся при каждом изменении фрагмента.

...