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.
drawerToggle
)) 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!
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.
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.
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.
Try this:
public boolean onQueryTextSubmit(String query) {
MenuItemCompat.collapseActionView(searchItem);
return false;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With