Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ActionBar with support library and Fragments overlay content

I added the android-support-library-v7-appcompat to my project to support ActionBar from API level 7 above.

It works like a charm on android 4.0+ and also on android 2.3 with a normal Activity that has setContentView in onCreate, but when the activity is loading an Fragment in onCreate the ActionBar gets overlapped with the content of my layout. At all other scenarios the ActionBar works well.

Here is some code:

class AssetsActivity extends ActionBarActivity{
    @Override
    protected void onCreate(Bundle arg0)
    {
        super.onCreate(arg0);

        OpenLocalFragment assets = OpenLocalFragment.newInstance(index);
            assets.setArguments(getIntent().getExtras());
        getSupportFragmentManager().beginTransaction()
                    .add(android.R.id.content, assets).commit();
    }
 }

The theme of this activity is set in the manifest to:

@style/Theme.AppCompat

An this is the result on android 2.3 (on 4.0+ the ActionBar shows well) actionBar overlaping

You can se that the first lisview item is overlaping the ActionBar(White round icon and title "My activity")

It is possible that i found a bug in the support library, it is released only for 2 days now? Thanks to all.

like image 220
Primoz990 Avatar asked Jul 26 '13 12:07

Primoz990


2 Answers

Edit: This is now officially fixed and released in the Support Library v19.

As JJD commented below, you can use normally android.R.id.content with appcompat-v7 r.19.0.0 or newer. The home button works too.

With other words: The workaround below is no more needed if you use version 19.0.0 or newer.


I got the answer at code.google.com. i've made a summary from frederic's answer:

For pre ICS devices you must use:

R.id.action_bar_activity_content

instead of

android.R.id.content

R.id.action_bar_activity_content is a new id used in layout for displaying app content, it would appear that it replace android.R.id.content when you use support v7 appcompat ActionBarActivity.

You can use this code to retrieve the correct id of the activity content :

public static int getContentViewCompat() {
    return Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH ?
               android.R.id.content : R.id.action_bar_activity_content;
}

Thanks to frederic

like image 80
Primoz990 Avatar answered Sep 27 '22 21:09

Primoz990


Another alternative if you do not want to modify the source code of android-support-library-v7-appcompat is to add an empty layout in the layout xml file such as:

<LinearLayout
    android:id="@+id/content_view"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

and make the fragment call to add to that layout instead:

ft.add(R.id.content_view, mFragment, mTag);
like image 24
doubleristretto Avatar answered Sep 27 '22 21:09

doubleristretto