ActionBarSherlock - Tabs appearing ABOVE actionbar

2019-01-21 23:08发布

问题:

I Am trying to create an actionbar without the app logo/text, and with a centralised picture, and i know it is possible with a custom view, here is my code:

protected void initActionBar()
{
    RelativeLayout custom = new RelativeLayout(getApplicationContext());
    ActionBar.LayoutParams params = new ActionBar.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
    custom.setLayoutParams(params); 

    custom.setGravity(Gravity.CENTER);
    custom.setBackgroundDrawable(getResources().getDrawable(R.drawable.background_grad_grey_rounded));

    ImageView image =new ImageView(getApplicationContext());
    image.setBackgroundResource(R.drawable.ic_launcher); 
    custom.addView(image);

    ab = getSupportActionBar();


    ab.setDisplayShowCustomEnabled(true);
    ab.setCustomView(custom);
    ab.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    tab_connect = ab.newTab();
    tab_connect.setText("CONNECT");
    tab_connect.setTabListener(this);

    tab_discover = ab.newTab();
    tab_discover.setText("DISCOVER");
    tab_discover.setTabListener(this);

    tab_simplify= ab.newTab();
    tab_simplify.setText("SIMPLIFY");
    tab_simplify.setTabListener(this);

    ab.addTab(tab_simplify);
    ab.addTab(tab_discover);
    ab.addTab(tab_connect);

    ab.setDisplayShowTitleEnabled(false);
    ab.setDisplayShowHomeEnabled(false);

}

however when i hide the logo, the actionbar shifts below my tabs like so:

but if i set ab.setDisplayShowHomeEnabled(true) the actionbar appears in it's right place (but with the logo which i don't want):

What am i doing wrong?

回答1:

Here's a simple workaround :

use the following in your onCreate method :

View homeIcon = findViewById(android.R.id.home);
((View) homeIcon.getParent()).setVisibility(View.GONE);

this collapses the home button completely.

PS : i'm using standard ActionBar but this should work the same

Or

if you want to support in Sherlock Actionbar to than you have to use this

actionBar.setLogo(null); // forgot why this one but it helped

View homeIcon = findViewById(
        Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ? 
        android.R.id.home : R.id.abs__home);
((View) homeIcon.getParent()).setVisibility(View.GONE);
((View) homeIcon).setVisibility(View.GONE);

actionBar.setDisplayShowTitleEnabled(false);


回答2:

It is worth noting that the selected answer will only work with the native ActionBar because the element android.R.id.home doesn't exist on pre-hc. That is, on pre-hc devices, you will get an NPE.

Since you are using ActionBarSherlock, I'm assuming you want to support pre-hc devices so you should use the correct id based on the platform version. ABS will expose the equivalent of android.R.id.home via R.id.abs__home for its implementation of the ActionBar.

So, we can tweak the suggested workaround as:

View homeIcon = findViewById(
                    Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ? 
                    android.R.id.home : R.id.abs__home);
((View) homeIcon.getParent()).setVisibility(View.GONE);


回答3:

this works great too! (read the bugreport comments ;))

actionBar.setLogo(new ColorDrawable(Color.TRANSPARENT));


回答4:

Following @furyfred answer, this code can be used when using the ActionBar from AppCompat library:

View homeIcon = findViewById(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ?
            android.R.id.home : android.support.v7.appcompat.R.id.home);

if (null != homeIcon && null != homeIcon.getParent())
{
    ((View) homeIcon.getParent()).setVisibility(View.GONE);
}


回答5:

All post above collapsing the home icon but leaving a blank space. For avoiding that you need to set the logo size to zero . Below added my code snippet.it may help for others who struggle with same problem.thanks

       actionBar.setLogo(new ColorDrawable(Color.TRANSPARENT));

      View homeIcon = findViewById(
                Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ? 
                android.R.id.home : R.id.abs__home);
        ((View) homeIcon.getParent()).setLayoutParams(new LinearLayout.LayoutParams(0, 0));
        ((View) homeIcon).setVisibility(View.GONE);


回答6:

I used this

ActionBar ab = getSupportActionBar();
ab.setDisplayShowHomeEnabled(true);
    ab.setDisplayHomeAsUpEnabled(false);
    ab.setHomeButtonEnabled(false);
    ab.setLogo(null);

    View homeIcon = findViewById(
            Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ? 
            android.R.id.home : R.id.abs__home);
    ((View) homeIcon.getParent()).setVisibility(View.GONE);
    ((View) homeIcon).setVisibility(View.GONE);

    ab.setDisplayShowTitleEnabled(false);


回答7:

just remove DISPLAY_SHOW_HOME flag from your actionBar.setDisplayOptions() method.