【问题标题】:Search action menu icon is not hiding搜索操作菜单图标未隐藏
【发布时间】:2016-04-07 12:59:59
【问题描述】:

我有一个放置 Fragment 的 MainActivity。具有 SearchView ( app:actionViewClass="android.support.v7.widget.SearchView" 的片段 ) 并且 MainActivity 在工具栏中有一个 SearchView 图标。 当片段的搜索视图为显示/隐藏(如 Flipkart 应用程序)时,我想隐藏/显示工具栏中的图标。当使用隐藏或显示方法之一时,它可以正常工作,但是当我同时使用它们时,它会给出类似的错误

java.lang.NullPointerException: Attempt to invoke interface method 'android.view.MenuItem android.view.Menu.findItem(int)' on a null object reference

我的代码 sn-ps 是..

MainActivity

 @Override
public boolean onCreateOptionsMenu(final Menu menu)
{
    _menu = menu;
    final Menu m= menu;
    getMenuInflater().inflate(R.menu.menus, menu);
    final MenuItem searchItem = menu.findItem(R.id.action_search);

    SearchManager searchManager = (SearchManager) DrawerActivity.this.getSystemService(Context.SEARCH_SERVICE);

    SearchView searchView = null;
    if (searchItem != null) {
        searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
    }
    if (searchView != null) {
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    }
    searchView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            m.performIdentifierAction(searchItem.getItemId(), 0);
        }
    });

    searchItem.setVisible(false);
    return super.onCreateOptionsMenu(menu);
}

public void show_search(){

    final MenuItem searchItem = _menu.findItem(R.id.action_search);
    searchItem.setVisible(true);
//        invalidateOptionsMenu();  //if i use this it not show the icon.
}

public void hide_search() {
    final MenuItem sitem = _menu.findItem(R.id.action_search); // gives NullPointerException in this line.
    sitem.setVisible(false);
    invalidateOptionsMenu();
}

片段代码:

public class Fragment1 extends Fragment
{

         scroll = (ScrollView) v.findViewById(R.id.scroll_view);

// Total Height of layout which contains searchview
    ViewTreeObserver vas = lin.getViewTreeObserver();
    vas.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            ViewGroup.MarginLayoutParams vlp = (ViewGroup.MarginLayoutParams) lin.getLayoutParams();
            search_size = lin.getMeasuredHeight() + vlp.topMargin;
            lin.getViewTreeObserver().removeGlobalOnLayoutListener(this);

        }
    });
         scroll.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {

        @Override
        public void onScrollChanged() {

            float y = scroll.getScrollY();

            DrawerActivity d = (DrawerActivity) getActivity();
            if (y >= search_size)
            {
                d.show_search();
            }
            else
            {
                d.hide_search();
            }
        }
    });
}

【问题讨论】:

    标签: android scrollview toolbar searchview


    【解决方案1】:

    早上好,你为什么不扩充其他 menu.xml 片段? 例如 .. 在您的片段插入中

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
    
        setHasOptionsMenu(true);
    }
    
    private Menu mMenu;
    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.menu_fragment, menu);
        mMenu = menu;
    
        MenuItem searchViewItem = menu.findItem(R.id.search);
    
        final android.support.v7.widget.SearchView searchView =
                (android.support.v7.widget.SearchView) MenuItemCompat.getActionView(searchViewItem);
    
        super.onCreateOptionsMenu(menu, inflater);
    }
    

    我帮过忙

    【讨论】:

    • 不,您只需尝试他的 Flipkart 应用程序,我只想在滚动时隐藏/显示工具栏中的搜索图标。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    • 1970-01-01
    • 2014-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    相关资源
    最近更新 更多