根据条件更改菜单项的可见性

问题描述 投票:0回答:1

我想根据“ currentPage”的值来更改菜单项-“ previous_page button”的可见性:

  • 当currentPage大于1时:“ previous_page_button”应该可见
  • 当currentPage == 1时:“ previous_page_button”应该不可见

我收到此错误:

findViewById<View>(R.id.previous_page_button) must not be null

这是我的菜单:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/previous_page_button"
        android:icon="@drawable/ic_arrow_back_black_24dp"
        android:title=""
        android:visible="false"
        app:showAsAction="ifRoom" />
    <item
        android:id="@+id/next_page_button"
        android:icon="@drawable/ic_arrow_forward_black_24dp"
        android:title=""
        app:showAsAction="ifRoom"
        tools:ignore="PrivateResource" />
</menu>

这是我想更改可见性的活动“ previous_page_button”:

    class MainActivity : AppCompatActivity() {

    private lateinit var adapter: BeerAdapter
    private val viewModel: MainViewModel by inject()

    private var startPage = 1
    private var pageSize = 25
    private var currentPage = startPage

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        initRecycler()
        listOfBeers()
        viewModel.onViewCreated(currentPage, pageSize)
    }

    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.menu_page, menu)
        return super.onCreateOptionsMenu(menu)
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {

        if (item.itemId == R.id.next_page_button){
            currentPage++
            if (currentPage > 1){
                findViewById<View>(R.id.previous_page_button).visibility = View.VISIBLE
            }
            initRecycler()
            viewModel.onViewCreated(currentPage, pageSize)
        } else if (item.itemId == R.id.previous_page_button){
            currentPage--
            initRecycler()
            viewModel.onViewCreated(currentPage,pageSize)
        }
        return super.onOptionsItemSelected(item)
    }

    private fun listOfBeers(){
        viewModel.beers.observe(this, Observer {
            if (it.isNotEmpty()){
                adapter.updateDataSet(it.toViewEntity())
            }
        })
    }

    private fun startBeerDetails(beerDetails: BeerDetailsView){
        startActivity(Intent(this, BeerDetails::class.java).apply {
            putExtra("BEER-DETAILS", beerDetails)
        })
    }

    private fun initRecycler(){
        recycler_view_main.layoutManager = GridLayoutManager(this, 1)
        adapter = BeerAdapter(
            onBeerClicked = {beer -> startBeerDetails(beer)}
        )
        recycler_view_main.adapter = adapter
    }
}
android kotlin android-menu
1个回答
0
投票
您应该使用findItem而不是findViewById尝试此操作

private var optionMenu : Menu? = null override fun onCreateOptionsMenu(menu: Menu?): Boolean { menuInflater.inflate(R.menu.menu_page, menu) optionMenu = menu return super.onCreateOptionsMenu(menu) } override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == R.id.next_page_button){ currentPage++ if (currentPage > 1){ optionMenu?.findItem(R.id.previous_page_button)?.visible = false } initRecycler() viewModel.onViewCreated(currentPage, pageSize) } else if (item.itemId == R.id.previous_page_button){ currentPage-- initRecycler() viewModel.onViewCreated(currentPage,pageSize) } return super.onOptionsItemSelected(item) }

© www.soinside.com 2019 - 2024. All rights reserved.