android - 当菜单项的可见性设置为 false 时,它​​会留下一个空格

标签 android menu android-actionbar searchview

我有一个功能,我需要一个菜单​​项在 searchView 展开时出现,并在 searchView 关闭时消失。我在展开时将该项目的 setVisible 设置为 false,它使菜单项在返回到 searchView 的折叠状态时消失,但它留下了一个空白区域。

截图:

  • https://www.dropbox.com/s/xbi1gr9j14e0hvi/stacksnip.JPG?dl=0
  • https://www.dropbox.com/s/bc8tar3n6dkhn5f/stacksnip1.JPG?dl=0

  • 是否有任何选项可以让 searchView 图标回到原来的位置?
    SearchManager searchManager =(SearchManager)getSystemService(Context.SEARCH_SERVICE);
        final MenuItem menuitem=menu.findItem(R.id.action_search);
        final MenuItem locationitem=menu.findItem(R.id.action_location).setVisible(false);
        SearchView searchView = (SearchView) menuitem.getActionView();
        if(null!=searchManager ) {
            searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        }
        searchView.setIconifiedByDefault(true);   //if using on actionbar
        searchView.setClickable(true);
        searchView.setOnSuggestionListener(new SearchView.OnSuggestionListener() {
            @Override
            public boolean onSuggestionClick(int position) {
                // Your code here
                return true;
            }
    
            @Override
            public boolean onSuggestionSelect(int position) {
                // Your code here
                return true;
            }
        });
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String s) {
                return false;
            }
    
            @Override
            public boolean onQueryTextChange(String s) {
                populateAdapter(s);
                return false;
            }
        });
        searchView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
            @Override
            public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
                SearchView searchView = (SearchView) v;
                if (searchView.isIconified()) {
    
                    locationitem.setVisible(false);
    
                    Log.d("Trial","Working!!");
                    fr=new Fragment_Two();
                    FragmentManager fm=getFragmentManager();
                    FragmentTransaction ft=fm.beginTransaction();
                    ft.replace(R.id.fragmentswitcher,fr);
                    ft.commit();
                }
                else{
                    locationitem.setVisible(true);
                    Log.d("Trial","Working too!!");
                    MenuItemCompat.setShowAsAction(menuitem, MenuItemCompat.SHOW_AS_ACTION_ALWAYS);
                    MenuItemCompat.setShowAsAction(locationitem, MenuItemCompat.SHOW_AS_ACTION_ALWAYS);
                    fr=new Fragment_One();
                    FragmentManager fm=getFragmentManager();
                    FragmentTransaction ft=fm.beginTransaction();
                    ft.replace(R.id.fragmentswitcher,fr);
                    ft.commit();
                    View newView=fr.getView();
    
                }
            }
        });
    

    最佳答案

    不幸的是,使用 setVisible()将隐藏菜单项,但菜单项仍会占用空间。您也不能转换为 View反对和使用setVisibility()也没有崩溃。我无法找到文档原因,但我确信它是故意这样设计的。

    要实现菜单项有时出现而不是其他时候出现的结果,您需要使用 onPrepareOptionsMenu() .在这个函数中,根据你喜欢的逻辑隐藏你不想显示的菜单项,并使用方法invalidateOptionsMenu()每当您想重绘菜单时。参见示例:

    public void someFunction() {
        invalidateOptionsMenu();
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        if (itemRemovalNeeded) {
            menu.removeItem(R.id.myItem);
        }
        return true;
    }
    

    引用:
    Android Activity Documentation

    关于android - 当菜单项的可见性设置为 false 时,它​​会留下一个空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28381380/

    相关文章:

    android - 如何使用senchatouch 2在android中实现phonegap应用

    jquery - 奇怪的下拉菜单jquery

    android - 在两个 fragment 之间传递数据

    Android 在拆分或堆叠时更改操作栏选项卡的选择器颜色

    android - Xamarin 项目中具有 BOOT_COMPLETED 操作的 BroadcastReceiver 的正确设置是什么?

    android - 在relativeLayout中依次添加几个textView(可变宽度)

    html - 使用CSS创建多个占据父级整个宽度的元素

    html - 悬停不在 css 菜单 active li 类上工作?对别人有用吗?

    java - 摆脱 Android 操作栏。

    android - SearchView(不在工具栏中)如何显示全屏下拉列表