4

I have a navigation drawer with this code:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout"
    android:fitsSystemWindows="true"
    android:layout_width="match_parent" android:layout_height="match_parent"
    tools:openDrawer="start">


    <!--<android.support.design.widget.AppBarLayout android:layout_height="wrap_content"-->
        <!--android:layout_width="match_parent" android:theme="@style/AppTheme.AppBarOverlay">-->

        <!--<android.support.v7.widget.Toolbar android:id="@+id/toolbar"-->
            <!--android:layout_width="match_parent" android:layout_height="?attr/actionBarSize"-->
            <!--android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay" />-->

    <!--</android.support.design.widget.AppBarLayout>-->

    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:background="#000000"
        android:layout_height="match_parent" >
    </FrameLayout>


    <!--<android.support.design.widget.AppBarLayout android:layout_height="wrap_content"-->
        <!--android:layout_width="match_parent" android:theme="@style/AppTheme.AppBarOverlay">-->

    <!--</android.support.design.widget.AppBarLayout>-->

    <!--<include-->
        <!--layout="@layout/app_bar_home_page"-->
        <!--android:layout_width="match_parent"-->
        <!--android:layout_height="match_parent" />-->

    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:headerLayout="@layout/nav_header_home_page"
        app:menu="@menu/activity_home_page_drawer"
        app:insetForeground="#4000"/>

</android.support.v4.widget.DrawerLayout>

I also set my style v21 with this:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>
    <item name="android:windowTranslucentStatus">true</item>
    <item name="windowActionModeOverlay">true</item>
</style>

But my problem is that the actionbar is always over my navigationdrawer, hiding his top side. here is a screenshot:

enter image description here

As you can see my actionbar is hiding the nav drawer.

How can I solve this? Any help will be appreciated.

Thanks all

PS:

this is what I want to achieve, it's the first image I found on the net. enter image description here

EDIT: note the images please, my aim is not the same of the "duplicate". He wanted to set his List below an header, I want to hide the statusbar with my drawer

EDIT2:

I'm back to the origins, now the navigation drawer is simply below the actionBar. This is my java code:

public class HomePageActivity extends AppCompatActivity implements IHomePage {

    private DrawerLayout drawerLayout;
    private NavigationView navigationView;
    private ActionBarDrawerToggle mDrawerToggle;
    private ActionBar ab;

    private boolean isDetail = false;
    private int lastSelected = 0;

    @Override
    protected void onResume() {
        super.onResume();

        if(mDrawerToggle != null) {
            mDrawerToggle.syncState();
        }

        if(navigationView != null){
            navigationView.getMenu().getItem(0).setChecked(true);
        } else{
            initDrawer();
            navigationView.getMenu().getItem(0).setChecked(true);
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home_page);

        navigationView = (NavigationView) findViewById(R.id.nav_view);
        drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

        initActionBar() ;
        initDrawer();

        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        PreferitiFragment fragment = new PreferitiFragment();
        fragmentTransaction.add(R.id.content_frame, fragment);
        fragmentTransaction.commit();

        mDrawerToggle.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        mDrawerToggle.onConfigurationChanged(newConfig);
    }
    @Override
    public boolean onOptionsItemSelected(final MenuItem item) {
        return mDrawerToggle.onOptionsItemSelected(item) || super.onOptionsItemSelected(item);
    }
    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        mDrawerToggle.syncState();
    }

    private void initActionBar() {
        ab = getSupportActionBar();
        if (ab == null) {
            Toast.makeText(this, "no", Toast.LENGTH_SHORT).show();
            return;
        }
        ab.setDisplayHomeAsUpEnabled(true);
        ab.setHomeButtonEnabled(true);


    }

    private void initDrawer() {

        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(MenuItem item) {

                int id = item.getItemId();
                lastSelected = id;

                switch (id){
                    case R.id.nav_favorite:
                        setFragment(new PreferitiFragment());
                        break;

                    case R.id.nav_search:
                        setFragment(new CercaPaeseFragment());
                        break;

                    case R.id.nav_settings:
                        setFragment(new ImpostazioniFragment());
                        break;

                    case R.id.nav_guida:
                        setFragment(new GuidaFragment());
                        break;
                    default:
                        setFragment(new PreferitiFragment());
                        break;
                }

                DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
                drawer.closeDrawer(GravityCompat.START);
                return true;
            }
        });

        mDrawerToggle = new ActionBarDrawerToggle(
                this,
                drawerLayout,
                R.string.navigation_drawer_open,
                R.string.navigation_drawer_close
        ) {
            @Override
            public void onDrawerClosed(View drawerView) {
                super.onDrawerClosed(drawerView);

                invalidateOptionsMenu();
//                mDrawerToggle.syncState();
            }

            @Override
            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
                invalidateOptionsMenu();
//                mDrawerToggle.syncState();
            }


        };
        drawerLayout.setDrawerListener(mDrawerToggle);
    }

    @Override
    public void showDetails(UUID idPharmacy) {

        isDetail = true;
        setFragment(new DettagliFragment());
    }

    @Override
    public void onBackPressed() {
        if (isDetail) {
            if(lastSelected == R.id.nav_search) {
                setFragment(new CercaPaeseFragment());
            } else if(lastSelected == R.id.nav_favorite){
                setFragment(new PreferitiFragment());
            }
        } else {
            super.onBackPressed();
        }
    }

    private void setFragment(Fragment fragment){


        IMyFragments iMyFragments = (IMyFragments) fragment;
        ab.setTitle(iMyFragments.getTitle());

        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.add(R.id.content_frame, fragment);
        fragmentTransaction.commit();
    }
}

And this is my home page layout:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:openDrawer="start">

    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:background="#000000"
        android:layout_height="match_parent" >
    </FrameLayout>

    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:headerLayout="@layout/nav_header_home_page"
        app:menu="@menu/activity_home_page_drawer" />

</android.support.v4.widget.DrawerLayout>
Pier Giorgio Misley
  • 4,977
  • 2
  • 20
  • 59

1 Answers1

3

On android.support.v4.widget.DrawerLayout You can try adding

android:paddingTop="?attr/actionBarSize"

Here is a simalar Question Android Navigation Drawer and windowActionBarOverlay = true

Or you can hide the action bar

from https://stackoverflow.com/a/22891560/1815624

Very simple.

getActionbar().hide();
getActionbar().show();

For the last part about the separator

<View
    android:layout_width="match_parent"
    android:layout_height="1dp"
    android:background="@android:color/darker_gray"/>

To add vertical separator, switch the layout_width and layout_height values

Or to put the drawer on top of the ActionbBar you can try the answer from:

https://stackoverflow.com/a/26174941/1815624

Below is some detailed steps for you to do that.

First, create a xml named "decor.xml" or anything you like. Only put the DrawerLayout and the drawer in. The "FrameLayout" below is just a container. We will use it to wrap your activity's content.

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout ...>
    <FrameLayout android:id="@+id/container"
        android:orientation="vertical" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"/>
    <fragment android:name="com...." 
        android:layout_gravity="start" 
        android:id="@id/navigation" 
        android:layout_width="@dimen/navigation_menu_width" 
        android:layout_height="fill_parent" />
</android.support.v4.widget.DrawerLayout>

and then remove the DrawerLayout in your main layout. Now the layout of your main activity should look like

<RelativeLayout android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent">
    ...
</RelativeLayout>

we assume that the main activity's layout is named "main.xml".

in your MainActivity, write as the following:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // Inflate the "decor.xml"
    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    DrawerLayout drawer = (DrawerLayout) inflater.inflate(R.layout.decor, null); // "null" is important.

    // HACK: "steal" the first child of decor view
    ViewGroup decor = (ViewGroup) getWindow().getDecorView();
    View child = decor.getChildAt(0);
    decor.removeView(child);
    FrameLayout container = (FrameLayout) drawer.findViewById(R.id.container); // This is the container we

defined just now. container.addView(child);

    // Make the drawer replace the first child
    decor.addView(drawer);

    // Do what you want to do.......

}

Now you've got a DrawerLayout which can slide over the ActionBar. But you might find it covered by status bar. You might need to add a paddingTop to the Drawer in order to fix that.

This is not ideal but it should help you... The white is the drawer the black is the main content and the blue is the title bar....

enter image description here

public class HomePageActivity extends AppCompatActivity {

    private DrawerLayout drawerLayout;
    private NavigationView navigationView;
    private ActionBarDrawerToggle mDrawerToggle;
    private ActionBar ab;

    private boolean isDetail = false;
    private int lastSelected = 0;

    @Override
    protected void onResume() {
        super.onResume();

        if(mDrawerToggle != null) {
            mDrawerToggle.syncState();
        }

//        if(navigationView != null){
//            navigationView.getMenu().getItem(0).setChecked(true);
//        } else{
//            initDrawer();
//            navigationView.getMenu().getItem(0).setChecked(true);
//        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home_page);

        navigationView = (NavigationView) findViewById(R.id.nav_view);
        drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

        initActionBar() ;
        initDrawer();

//        FragmentManager fragmentManager = getFragmentManager();
//        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
//        PreferitiFragment fragment = new PreferitiFragment();
//        fragmentTransaction.add(R.id.content_frame, fragment);
//        fragmentTransaction.commit();

        mDrawerToggle.syncState();

        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        navigationView = (NavigationView) findViewById(R.id.nav_view);
        DrawerLayout drawer = (DrawerLayout) inflater.inflate(R.layout.drawer_layout, null);

        // HACK: "steal" the first child of decor view
        ViewGroup decor = (ViewGroup) getWindow().getDecorView();
        View child = decor.getChildAt(0);
        decor.removeView(child);
        FrameLayout container = (FrameLayout) drawer.findViewById(R.id.content_frame); // This is the container we defined just now.
        container.addView(child);
        decor.addView(drawer);
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        mDrawerToggle.onConfigurationChanged(newConfig);
    }
    @Override
    public boolean onOptionsItemSelected(final MenuItem item) {
        return mDrawerToggle.onOptionsItemSelected(item) || super.onOptionsItemSelected(item);
    }
    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        mDrawerToggle.syncState();
    }

    private void initActionBar() {
        ab = getSupportActionBar();
        if (ab == null) {
            Toast.makeText(this, "no", Toast.LENGTH_SHORT).show();
            return;
        }
        ab.setDisplayHomeAsUpEnabled(true);
        ab.setHomeButtonEnabled(true);


    }

    private void initDrawer() {

        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(MenuItem item) {

                int id = item.getItemId();
                lastSelected = id;

//                switch (id){
//                    case R.id.nav_favorite:
//                        setFragment(new PreferitiFragment());
//                        break;
//
//                    case R.id.nav_search:
//                        setFragment(new CercaPaeseFragment());
//                        break;
//
//                    case R.id.nav_settings:
//                        setFragment(new ImpostazioniFragment());
//                        break;
//
//                    case R.id.nav_guida:
//                        setFragment(new GuidaFragment());
//                        break;
//                    default:
//                        setFragment(new PreferitiFragment());
//                        break;
//                }

                DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
                drawer.closeDrawer(GravityCompat.START);
                return true;
            }
        });

        mDrawerToggle = new ActionBarDrawerToggle(
                this,
                drawerLayout,
                android.R.drawable.ic_btn_speak_now,
                R.string.open,
                R.string.close
        ) {
            @Override
            public void onDrawerClosed(View drawerView) {
                super.onDrawerClosed(drawerView);

                invalidateOptionsMenu();
//                mDrawerToggle.syncState();
            }

            @Override
            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
                invalidateOptionsMenu();
//                mDrawerToggle.syncState();
            }


        };
        drawerLayout.setDrawerListener(mDrawerToggle);
    }

//    @Override
//    public void showDetails(UUID idPharmacy) {
//
//        isDetail = true;
//        setFragment(new DettagliFragment());
//    }

//    @Override
//    public void onBackPressed() {
//        if (isDetail) {
//            if(lastSelected == R.id.nav_search) {
//                setFragment(new CercaPaeseFragment());
//            } else if(lastSelected == R.id.nav_favorite){
//                setFragment(new PreferitiFragment());
//            }
//        } else {
//            super.onBackPressed();
//        }
//    }

//    private void setFragment(Fragment fragment){
//
//
//        IMyFragments iMyFragments = (IMyFragments) fragment;
//        ab.setTitle(iMyFragments.getTitle());
//
//        FragmentManager fragmentManager = getFragmentManager();
//        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
//        fragmentTransaction.add(R.id.content_frame, fragment);
//        fragmentTransaction.commit();
//    }
}
Community
  • 1
  • 1
CrandellWS
  • 2,358
  • 4
  • 44
  • 100