android 使用actionLayout时未调用onOptionsItemSelected(Sherlock菜单栏)

z31licg0  于 2024-01-04  发布在  Android
关注(0)|答案(7)|浏览(130)

在菜单项中使用actionLayout时,未调用onOptionsItemSelected方法。是我遗漏了什么,还是Sherlock工具栏存在已知问题?
活动

  1. @Override
  2. public boolean onCreateOptionsMenu(Menu menu) {
  3. MenuInflater inflater = getSupportMenuInflater();
  4. inflater.inflate(R.menu.article, menu);
  5. super.onCreateOptionsMenu(menu);
  6. return true;
  7. }
  8. @Override
  9. public boolean onOptionsItemSelected(MenuItem item) {
  10. Log.d(TAG, "onOptionsItemSelected()");
  11. switch (item.getItemId()) {
  12. case android.R.id.home:
  13. finish();
  14. return true;
  15. case R.id.menu_item_comment:
  16. return true;
  17. default:
  18. return super.onOptionsItemSelected(item);
  19. }
  20. }

字符串
菜单

  1. <item android:id="@+id/menu_item_comment"
  2. android:showAsAction="ifRoom"
  3. android:actionLayout="@layout/action_bar_comment_layout"/>

jslywgbw

jslywgbw1#

好吧,你必须在actionLayout上设置onClickList来接收回调。我是这样做的:

  1. @Override
  2. public boolean onCreateOptionsMenu(Menu menu) {
  3. getSupportMenuInflater().inflate(R.menu.map_menu, menu);
  4. for (int i = 0; i < menu.size(); i++) {
  5. MenuItem item = menu.getItem(i);
  6. if (item.getItemId() == R.id.menu_more) {
  7. itemChooser = item.getActionView();
  8. if (itemChooser != null) {
  9. itemChooser.setOnClickListener(this);
  10. }
  11. }
  12. }
  13. return super.onCreateOptionsMenu(menu);
  14. }

字符串

展开查看全部
eivnm1vs

eivnm1vs2#

你必须添加自己的OnClickListener并显式调用onOptionsItemSelected

  1. @Override
  2. public boolean onCreateOptionsMenu(Menu menu) {
  3. MenuItem awesomeMenuItem = menu.findItem(R.id.action_awesome);
  4. View awesomeActionView = awesomeMenuItem.getActionView();
  5. awesomeActionView.setOnClickListener(new View.OnClickListener() {
  6. @Override
  7. public void onClick(View v) {
  8. onOptionsItemSelected(awesomeMenuItem);
  9. }
  10. });
  11. }

字符串
P.S:不知道为什么它不工作的盒子。

wwwo4jvm

wwwo4jvm3#

如果您正在为旧版本开发,则应使用MenuItemCompat. getViewView(menuItem);而不是item. getViewView();

  1. @Override
  2. public boolean onCreateOptionsMenu(Menu menu) {
  3. getMenuInflater().inflate(R.menu.menu, menu);
  4. for (int i = 0; i< menu.size() ;i++) {
  5. MenuItem menuItem = menu.getItem(i);
  6. if (menuItem.getItemId() == R.id.add_item) {
  7. View view = MenuItemCompat.getActionView(menuItem);
  8. if (view != null) {
  9. view.setOnClickListener(new OnClickListener() {
  10. @Override
  11. public void onClick(View v) {
  12. Intent intent = new Intent(MainActivity.this, ToDoActivity.class);
  13. startActivity(intent);
  14. }
  15. });
  16. }
  17. }
  18. }
  19. return true;
  20. }

字符串

展开查看全部
fhg3lkii

fhg3lkii4#

  1. override fun onCreateOptionsMenu(menu: Menu?): Boolean {
  2. menuInflater.inflate(R.menu.menu_add_require, menu)
  3. val menuItem = menu!!.findItem(R.id.menu_cart)
  4. val view = menuItem.actionView
  5. view.setOnClickListener {
  6. onOptionsItemSelected(menuItem)
  7. }
  8. return true
  9. }

字符串
为我工作(代码在Kotlin中)

r8uurelv

r8uurelv5#

  1. @Override
  2. public boolean onCreateOptionsMenu(Menu menu) {
  3. super.onCreateOptionsMenu(menu);
  4. getMenuInflater().inflate(R.menu.main, menu);
  5. View view = menu.findItem(R.id.menu_item_comment).getActionView();
  6. view.setOnClickListener(new View.OnClickListener() {
  7. @Override
  8. public void onClick(View v) {
  9. // do something
  10. }
  11. });
  12. return true;
  13. }

字符串
此外,(这对我来说非常重要,所以其他答案不起作用)您需要禁用Action布局中所有视图的可单击选项(即action_bar_comment_layout.xml):

  1. android:clickable="false"

展开查看全部
zz2j4svz

zz2j4svz6#

结合@Arun Kumar和@Luten的答案,下面的方法将使实现通用化。对于所有使用actionView的菜单项,我们setOnClickListener来调用onOptionsItemSelected(item)。这样我们就可以混合和匹配普通和actionLayout菜单项,而不必担心单独设置onClickListeners。

  1. @Override
  2. public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
  3. menu.clear();
  4. inflater.inflate(menuResourceId(), menu);
  5. for (int i = 0; i < menu.size(); i++) {
  6. final MenuItem item = menu.getItem(i);
  7. View actionView = MenuItemCompat.getActionView(item);
  8. if (actionView != null) {
  9. actionView.setOnClickListener(new View.OnClickListener(){
  10. @Override
  11. public void onClick(View v){
  12. onOptionsItemSelected(item);
  13. }
  14. });
  15. }
  16. }
  17. super.onCreateOptionsMenu(menu, inflater);
  18. }

字符串

展开查看全部
rn0zuynd

rn0zuynd7#

在修复这个问题之前,我必须解决几个问题。据我所知,与Kotlin最相关。
1.请确保从MainActivities onCreate调用它:

  1. setSupportActionBar(findViewById(R.id.my_toolbar))

字符串
2.您的Activities onCreate不应实现persistentState:PersistableBundle?。
所以它应该看起来像这样:

  1. class AboutActivity: AppCompatActivity() {
  2. lateinit var binding : ActivityAboutBinding
  3. override fun onCreate(savedInstanceState: Bundle?) {
  4. Log.d("AboutActivityLog", "About Activity onCreate called.")
  5. super.onCreate(savedInstanceState)
  6. binding = ActivityAboutBinding.inflate(layoutInflater)
  7. setContentView(binding.root)
  8. }
  9. }


而不是像这样

  1. class AboutActivity: AppCompatActivity() {
  2. lateinit var binding : ActivityAboutBinding
  3. override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
  4. Log.d("AboutActivityLog", "About Activity onCreate called.")
  5. super.onCreate(savedInstanceState, persistentState)
  6. binding = ActivityAboutBinding.inflate(layoutInflater)
  7. setContentView(binding.root)
  8. }
  9. }

展开查看全部

相关问题