Reputation: 5351
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:
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.
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>
Upvotes: 4
Views: 4735
Reputation: 2804
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....
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();
// }
}
Upvotes: 3