java - oreo - Cajón de navegación en Android no es pantalla completa
pantalla completa android 8 (6)
La mejor solución para usted es crear un cajón de navegación personalizado. Entiendo que no desea utilizar un tercero, pero esta puede ser una solución rápida para su problema. Sliding Menu Lib link .
Desde que Google introdujo el cajón de navegación, traté de usar este componente para crear un menú similar al de Facebook. El problema es que el efecto visual parece ser diferente.
El de Google tiene la barra de acción retener cuando el cajón está abierto, mientras que el de Facebook no. En su lugar, toda la pantalla se ha desplazado hacia el lado derecho
He encontrado que hay algunas posibilidades para lograr esto, pero como prefiero no incluir lib de terceros en el proyecto, ¿hay alguna forma de lograrlo? Gracias
Código basado en el tutorial del cajón de navegación
protected void setupMenu(List<String> list, final ListView menu) {
Adapter customAdapter = new Adapter(getActionBar().getThemedContext(),
R.layout.item, list);
menu.setAdapter(customAdapter);
menu.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
final int pos, long id) {
String selected = ((TextView) view.findViewById(R.id.itemTxt))
.getText().toString();
// define pass data
final Bundle bData = new Bundle();
bData.putString("itemSelect", selected);
drawer.setDrawerListener(new DrawerLayout.SimpleDrawerListener() {
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
FragmentTransaction tx = getSupportFragmentManager()
.beginTransaction();
tx.replace(R.id.mainContent, Fragment.instantiate(
MainActivity.this,
"com.example.utilities.ContentPage", bData));
tx.commit();
}
});
drawer.closeDrawer(menu);
}
});
}
Si revisas el código fuente de DrawerLayout, verás, que resposnible para este margen mínimo es la variable mMinDrawerMargin
Entonces, hay al menos 2 soluciones (trucos) 1. extienda DrawerLayout y establezca esta variable en 0 con reflexión. llama a este método desde todos los constructores.
private void init() {
try {
Field declaredField = getClass().getSuperclass().getDeclaredField("mMinDrawerMargin");
declaredField.setAccessible(true);
declaredField.setInt(declaredField, 0);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
- no tan complicado
método overryde onMeasure como este
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// taken from parents logic
float density = this.getResources().getDisplayMetrics().density;
int minMargin = (int) (64.0F * density + 0.5F);
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int newWidth = MeasureSpec.makeMeasureSpec(widthSize + minMargin, widthMode);
super.onMeasure(newWidth, heightMeasureSpec);
}
También creé un proyecto de muestra aquí https://bitbucket.org/wnc_21/fsnavigationdrawer
este problema es causado por el margen, por lo que debemos restablecer el ancho: resolví este problema implementando DrawerListener y ajustando ListView dentro de LinearLayout para crear salas para otras vistas al lado de la vista de lista
aquí está mi oyente
public class NavigationDrawer implements DrawerLayout.DrawerListener {
private DrawerLayout mDrawerLayout;
protected boolean expanded = false;
NavigationDrawer(Activity activity) {
this.activity = activity;
}
public NavigationDrawer bindDrawerLayout(int id) {
mDrawerLayout = (DrawerLayout) activity.findViewById(id);
mDrawerLayout.setDrawerListener(this);
return this;
}
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
if (!expanded) {
Log.i("margin", "here we are");
LinearLayout layout = (LinearLayout) findViewById(R.id.left_drawer);
layout.getLayoutParams().width = getResources().getDisplayMetrics().widthPixels;
layout.requestLayout();
expanded = true;
}
}
@Override
public void onDrawerOpened(View drawerView) {
}
@Override
public void onDrawerClosed(View drawerView) {
}
@Override
public void onDrawerStateChanged(int newState) {
}
}
aquí está mi diseño:
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/application_drawer_layout"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:background="#ffffff">
<FrameLayout
android:id="@+id/application_content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<LinearLayout
android:id="@+id/left_drawer"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="start"
android:background="#000000"
android:orientation="vertical">
<ListView
android:id="@+id/application_left_drawer"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="#111"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp" />
</LinearLayout>
</android.support.v4.widget.DrawerLayout>
Aquí hay una solución rápida que funcionó para mí:
<include
android:id="@+id/left_drawer"
android:orientation="vertical"
**android:layout_width="320dp"**
android:layout_height="match_parent"
android:layout_gravity="start"
layout="@layout/drawer"/>
Establecer el ancho del diseño incluido. Para dispositivos con diferentes tamaños de pantalla, puede establecer dinámicamente el ancho de este diseño incluido.
Todo lo mejor !!!!
Si desea implementar el menú deslizante de Facebook, use androids SlidingPaneLayout en lugar de NavigationDrawer.
<android.support.v4.widget.SlidingPaneLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout android:layout_width="250dp"
android:layout_height="match_parent"
android:background="#CC00FF00" />
<LinearLayout android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="match_parent"
android:background="#CC0000FF" >
// add toolbar and other required layouts
</LinearLayout>
</android.support.v4.widget.SlidingPaneLayout>
agregue la barra de herramientas en lugar de la barra de acciones y no aplique ningún tema de la barra de acciones.
Espero que esto ayude.
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
>
<include
layout="@layout/nav_header_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</android.support.design.widget.NavigationView>
Eliminar las dos últimas líneas en el código predeterminado
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/activity_main_drawer"