Android appcompat API 10折叠操作视图

时间:2014-03-24 21:38:30

标签: android android-actionbar android-appcompat android-search

我目前正在开发需要支持Api10 +的Android应用 我按照许多教程来设置appcompat来管理创建操作栏。

链接如: https://stackoverflow.com/a/21291156/2789106 http://developer.android.com/guide/topics/ui/actionbar.html

我不能做的事情只有三件事。

  1. 当搜索打开时,搜索放大镜不会更改为我设置的可绘制对象。
  2. 我无法改变"返回"图标(主页按钮,留给徽标(它与我在创建drawerToggle时传递的图像不同))
  3. 单击键盘搜索时,无法以编程方式关闭(折叠)操作视图。 (在API 14中调用了collapseActionView()
  4. 这是我的代码:

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        // ActionBarDrawerToggle ties together the the proper interactions
        // between the sliding drawer and the action bar app icon
    
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    
        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                R.drawable.ic_navigation_drawer,
                R.string.navigation_drawer_open,
                R.string.navigation_drawer_close) {
    
            /** Called when a drawer has settled in a completely closed state. */
            public void onDrawerClosed(View view) {
                supportInvalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            }
    
            /** Called when a drawer has settled in a completely open state. */
            public void onDrawerOpened(View drawerView) {
                supportInvalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            }
    
        };
    
        // Set the drawer toggle as the DrawerListener
        mDrawerLayout.setDrawerListener(mDrawerToggle);
    
        // Restore app state if any
        if (savedInstanceState == null) {
            mLeftMenuContainer = (LinearLayout) findViewById(R.id.left_menu_container);
            mLeftMenuContainer.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View arg0, MotionEvent arg1) {
                    // return TRUE to avoid tap on back view
                    return true;
                }
    
            });
            mDrawerLayout.closeDrawer(mLeftMenuContainer);
    
        }
    
        // enable ActionBar app icon to behave as action to toggle nav drawer
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);
        getSupportActionBar().setDisplayShowTitleEnabled(true);
        getSupportActionBar().setLogo(R.drawable.ic_action_bar_logo);
    
    }
    
    /* Called whenever we call supportInvalidateOptionsMenu() */
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        // If the nav drawer is open, hide action items related to the content
        // view
        if (mDrawerLayout != null && mLeftMenuContainer != null) {
            boolean drawerOpen = mDrawerLayout.isDrawerOpen(mLeftMenuContainer);
            for (int i = 0; i < menu.size(); i++) {
                menu.getItem(i).setVisible(!drawerOpen);
            }
        }
    
        return super.onPrepareOptionsMenu(menu);
    }
    
    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        // Sync the toggle state after onRestoreInstanceState has occurred.
        mDrawerToggle.syncState();
    }
    
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        mDrawerToggle.onConfigurationChanged(newConfig);  
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    
        mMenu = menu;
        // Inflate the menu; this adds items to the action bar if it is present.
        // enable ActionBar app icon to behave as action to toggle nav drawer
        getMenuInflater().inflate(R.menu.main, menu);
    
        MenuItem searchItem = menu.findItem(R.id.action_bar_search);
        final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
    
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchableInfo info = searchManager.getSearchableInfo(getComponentName());
    
        searchView.setSearchableInfo(info);  
    
        AutoCompleteTextView searchText = (AutoCompleteTextView) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
        searchText.setHintTextColor(getResources().getColor(R.color.color_action_bar_search_text));
        searchText.setTextColor(getResources().getColor(R.color.color_action_bar_search_text));
    
        searchView.setIconifiedByDefault(true);
    
        // Getting the 'search_plate' LinearLayout.
        View searchPlate = searchView.findViewById(android.support.v7.appcompat.R.id.search_plate);
        // Setting background of 'search_plate' to personal defined drawable.
        if (searchPlate != null) {
            searchPlate
                .setBackgroundResource(R.drawable.texfield_search_view_theme);
        }
    
        // Set search view clear icon
        ImageView searchIconClearView = (ImageView) searchView
                .findViewById(android.support.v7.appcompat.R.id.search_close_btn);
        if (searchIconClearView != null) {
            Log.v(LOG_TAG, "Should Change Clear Icon here");
    
            searchIconClearView
                .setImageResource(R.drawable.ic_action_bar_clear_search);
    
        }
    
        // Set search view Magnifier icon
        ImageView searchIcon = (ImageView) searchView.findViewById(android.support.v7.appcompat.R.id.search_mag_icon);
        if (searchIcon != null) {
            Log.v(LOG_TAG, "Should Change Search Icon here");
            searchIcon.setImageResource(R.drawable.ic_action_bar_back);
        }
    
        // Set on click to open a fragment, not a activity
        final SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextChange(String newText) {
                // Do something
                return true;
            }
    
            @Override
            public boolean onQueryTextSubmit(String query) {
                Log.v(LOG_TAG, "Performed search with: " + query);
                searchView.clearFocus();
                return true;
            }
        };
    
        searchView.setOnQueryTextListener(queryTextListener);
    
        MenuItemCompat.setOnActionExpandListener(searchItem, new OnActionExpandListener() {
    
            @Override
            public boolean onMenuItemActionCollapse(MenuItem arg0) {
                mMenu.findItem(R.id.action_bar_cart).setVisible(true);
                return true;
            }
    
            @Override
            public boolean onMenuItemActionExpand(MenuItem arg0) {
                getSupportActionBar().setIcon(R.drawable.ic_action_bar_logo);
                mMenu.findItem(R.id.action_bar_cart).setVisible(false);
                return true;
            }
    
    
        });
    
        return super.onCreateOptionsMenu(menu);
    }
    

    有人可以告诉我,如果我做错了吗?

    - 编辑 -

    我设法解决了问题1和2:

    您需要做的是在主题中定义homeUpIcon。所以如果你像我一样支持API 10:

    <style name="Theme.MyTheme" parent="@style/Theme.AppCompat.Light">
        <item name="searchViewSearchIcon">@drawable/your_search_icon</item>
    
        <!-- API 13- Support -->
        <item name="homeAsUpIndicator">@drawable/your_back_icon</item> 
    
        <!-- API 14+  -->
        <item name="android:homeAsUpIndicator">@drawable/your_back_icon</item> 
    
    </style>
    

    发现于 ActionBarSherlock: changing homeAsUpIndicator doesn't work
    Changing the background drawable of the searchview widget

    最重要的问题仍然悬而未决,如果有人知道答案,请在此发帖!

1 个答案:

答案 0 :(得分:19)

试试这个:

   public boolean onQueryTextSubmit(String query) {
        MenuItemCompat.collapseActionView(searchItem);
        return false;
    }