Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get the "up" button used on the Toolbar?

This is a short question:

I'm trying to force the action bar (used by a Toolbar) to use LTR alignment. I've succeeded making the layout itself use LTR, but not the "up" button (as I've done here, before Toolbar was introduced) .

It seems this view doesn't have an ID, and I think using getChildAt() is too risky.

Can anyone help?


The answer

Here's one way I've found to solve this, based on this answer .

I made it so that it is guarranteed to find only the "up" button, and whatever it does, it will revert back to the previous state it was before.

Here's the code:

  @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
  @Override
  public boolean onCreateOptionsMenu(final Menu menu)
    {
    // <= do the normal stuff of action bar menu preparetions
    if(VERSION.SDK_INT>=VERSION_CODES.JELLY_BEAN_MR1&&getResources().getConfiguration().getLayoutDirection()==View.LAYOUT_DIRECTION_RTL)
      {
      final ArrayList<View> outViews=new ArrayList<>();
      final CharSequence previousDesc=_toolbar.getNavigationContentDescription();
      for(int id=0;;++id)
        {
        final String uniqueContentDescription=Integer.toString(id);
        _toolbar.findViewsWithText(outViews,uniqueContentDescription,View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION);
        if(!outViews.isEmpty())
          continue;
        _toolbar.setNavigationContentDescription(uniqueContentDescription);
        _toolbar.findViewsWithText(outViews,uniqueContentDescription,View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION);
        if (outViews.isEmpty())
           if (BuildConfig.DEBUG)
                    throw new RuntimeException(
                            "You should call this function only when the toolbar already has views");
                else
                    break;
        outViews.get(0).setRotation(180f);
        break;
        }
      _toolbar.setNavigationContentDescription(previousDesc);
      }
    //
    return super.onCreateOptionsMenu(menu);
    }
like image 280
android developer Avatar asked Nov 27 '14 16:11

android developer


People also ask

How do I change the button on my toolbar?

In Toolbar contents, select the button whose text you want to change. Click Edit, and then enter your changes.

Where is toolbar button?

The toolbar, also called bar or standard toolbar, is a row of buttons, often near the top of an application window, that controls software functions. The boxes are below the menu bar and often contain images corresponding with the function they control, as demonstrated in the image below.

Can you Customise Using this toolbar?

You can add, remove, and change the order of the commands on the Quick Access Toolbar by using the Options command. Select File > Options > Quick Access Toolbar. Use the Add and Remove buttons to move items between the Customize the Access Toolbar list and the Choose command from list.


1 Answers

It seems this view doesn't have an ID

You're right, the navigation view is created programmatically and never sets an id. But you can still find it by using View.findViewsWithText.

View.findViewsWithText comes with two flags:

  • View.FIND_VIEWS_WITH_TEXT

  • View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION

The navigation view's default content description is "Navigate up" or the resource id is abc_action_bar_up_description for AppCompat and action_bar_up_description for the framework's, but you can easily apply your own using Toolbar.setNavigationContentDescription.

Here's an example implementation:

final Toolbar toolbar = ...;
toolbar.setNavigationContentDescription("up");
setActionBar(toolbar);

final ArrayList<View> outViews = Lists.newArrayList();
toolbar.findViewsWithText(outViews, "up", View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION);

outViews.get(0).setRotation(180f);

Results

example

like image 127
adneal Avatar answered Oct 21 '22 11:10

adneal