Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android appcompat API 10 collapse action view

I'm currently developing and Android app that needs to support Api10+ I followed many tutorials to set appcompat to manage to create the action bar.

links like: https://stackoverflow.com/a/21291156/2789106 http://developer.android.com/guide/topics/ui/actionbar.html

There are only three things that I cannot do.

  1. When the search opens, the search magnifier does NOT change to the drawable I set.
  2. I cannot change the "back" icon (the home up button, left to the logo (it's a diferrent image than the one I passed in the creation of the drawerToggle))
  3. I cannot programmatically close (collapse) the action view when the keyboard Search is clicked. (calling collapseActionView() was inplemented in API 14)

Here's my code:

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);
}

Can someone please tell me if I'm doing something wrong?

-- EDIT --

I managed to fix question number 1 and 2:

What you need to do is to define the homeUpIcon in your Theme. So If you are supporting API 10 like me:

<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>

found in
ActionBarSherlock: changing homeAsUpIndicator doesn't work
and Changing the background drawable of the searchview widget

The most important question is still pending and if anyone knows the answer please post here!

like image 528
Thalescm Avatar asked Mar 24 '14 21:03

Thalescm


People also ask

What is collapse Actionview?

The collapseActionView flag indicates how to display the widget when the user is not interacting with it: If the widget is on the app bar, the app should display the widget as an icon. If the widget is in the overflow menu, the app should display the widget as a menu item.

What does the onOptionsItemSelected() method receives as a parameter?

Fragment's onOptionsItemSelected() receives the selected menu item as a parameter and returns a boolean to indicate whether or not the touch has been consumed. Once an activity or fragment returns true from onOptionsItemSelected() , no other participating fragments will receive the callback.

How to add action bar in Android?

To add actions to the action bar, create a new XML file in your project's res/menu/ directory. The app:showAsAction attribute specifies whether the action should be shown as a button on the app bar.


1 Answers

Try this:

   public boolean onQueryTextSubmit(String query) {
        MenuItemCompat.collapseActionView(searchItem);
        return false;
    }
like image 171
anapsil Avatar answered Oct 23 '22 12:10

anapsil