尚未解决的在MainActivity.kt中调用菜单ID

时间:2020-06-11 21:52:02

标签: android kotlin

我试图通过菜单调用ID进行搜索。

菜单:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/country_list"
        android:title="search"
        android:icon="@android:drawable/ic_menu_search"
        app:actionViewClass="androidx.appcompat.widget.SearchView"
        app:showAsAction="ifRoom"/>

    </menu>

在MainActivity.kt中:

package com.dbtest.searchtobezapped

import android.app.SearchManager
import android.content.Context
import android.graphics.ColorSpace
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.Menu
import android.widget.Toast
import androidx.appcompat.widget.SearchView
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {
    var countries:MutableList<String> = ArrayList()
    var displayList:MutableList<String> = ArrayList()

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

        country_list.layoutManager = GridLayoutManager(this,2)
        country_list.adapter = CountryAdapter(displayList,this)

    }

当我尝试在MainActivity中调用country_list时,仍无法解决?

请问有什么想法-真的很感激吗?

更新 因此,在终于有一些时间来看看我是否可以使它工作时…… 我相信我在onCreateOptionsMenu()中有通货膨胀,在onOptionsItemSelected()中具有单击处理程序,但是我仍然从main.xml中获得ID(country_list),但在MainActivity.kt中仍未解决? 由于还有其他未解决的问题(在更新的代码中突出显示),这看起来像O缺少要导入的东西或其他东西吗?
(我花了一些时间查看https://developer.android.com/guide/topics/ui/menus,但看不到我缺少的内容。)

package com.dbtest.searchtobezapped
import android.app.SearchManager
import android.content.Context
import android.graphics.ColorSpace
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.*
import android.widget.Toast
import androidx.appcompat.widget.SearchView
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    var countries:MutableList<String> = ArrayList()
    var displayList:MutableList<String> = ArrayList()

 override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
     setContentView(R.layout.activity_main)
     loadData()
     country_list.layoutManager = LinearLayoutManager(this)
     country_list.layoutManager = GridLayoutManager(this,2)
    country_list.adapter = CountryAdapter(displayList,this)
 }

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    val inflater = menuInflater inflater.inflate(R.menu.main, menu)

    val manager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
    val searchItem = menu?.findItem(R.id.action_search)
    val searchView = searchItem?.actionView as SearchView

    searchView.setSearchableInfo(manager.getSearchableInfo(componentName))

    searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
        override fun onQueryTextSubmit(query: String?): Boolean {
            searchView.clearFocus()
            searchView.setQuery("", false )
            searchItem.collapseActionView()
            Toast.makeText(this@MainActivity, "True: Look for $query", Toast.LENGTH_LONG).show()

            return true
        }

        override fun onQueryTextChange(newText: String?): Boolean {
            Toast.makeText(this@MainActivity, "Fail: Look for $newText",Toast.LENGTH_LONG).show()
            return false
        }

    }
    )
    return true
}

class CountryAdapter(items : List<String>,ctx:Context) :       RecyclerView.Adapter<CountryAdapter.ViewHolder>(){

    private var list = items
    private var context = ctx

    override fun getItemCount(): Int {
        return list.size
    }

    override fun onBindViewHolder(holder: ViewHolder?, position: Int) {
        holder?.name?.text = list[position]
    }

    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder {
        return ViewHolder(LayoutInflater.from(context).inflate(R.layout.country_child,parent,false))
    }


    class ViewHolder(v: View) : RecyclerView.ViewHolder(v){
        val name = v.country_name!!
    }
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    // Handle item selection
    return when (item.itemId) {
        R.id.option1 -> {
            //do something 1
            true
        }
        R.id.option2 -> {
            //do something 1
            true
        }
        else -> super.onOptionsItemSelected(item)
    }
}

private fun loadData(){
    countries.add("Afghanistan")
    countries.add("Albania")
    countries.add("Zimbabwe")
    displayList.addAll(countries)
}

}

1 个答案:

答案 0 :(得分:2)

我相信菜单必须在其各自的方法回调中进行夸大:

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    val inflater: MenuInflater = menuInflater
    inflater.inflate(R.menu.game_menu, menu)
    //here do your adapter stuff
    return true
}

并处理菜单项上的点击:

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    // Handle item selection
    return when (item.itemId) {
        R.id.option1 -> {
            //do something 1 
            true
        }
        R.id.option2 -> {
            //do something 1 
            true
        }
        else -> super.onOptionsItemSelected(item)
    }
}

我看不到您要执行的操作,但不确定是否可以将适配器设置为菜单项

更多信息:https://developer.android.com/guide/topics/ui/menus