Android définir la liste de tiroir de navigation pour ouvrir la moitié exacte de l'écran pour tous les écrans de l'appareil
Je veux ouvrir la liste de tiroirs à la moitié de l'écran pour tous les appareils différents. j'ai essayé des valeurs codées en dur pour layout_margineleft 200dp ou 100dp à la liste de tiroirs. mais cela ne fonctionne pas dans tous les appareils, il est différent d'un appareil à l'autre. alors, comment puis-je maintenir exactement la moitié de l'écran pour drawerlist. j'ai également essayé diverses fonctions comme setLeft (int) etc.mais certains d'entre eux ne fonctionnent pas en raison de l'utilisation de la version minimale 8. Donc, s'il vous plaît aider moi. merci à l'avance.
mDrawerLayout = (DrawerLayout) view.findViewById(R.id.drawer_layout);
mDrawerList = (ListView) view.findViewById(R.id.top_sectionlist);
Xml pour que:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/setting_background" >
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_margin="@dimen/top_news_linear_margin"
android:background="@color/news_list_divider_color"
android:orientation="vertical"
android:padding="@dimen/top_news_linear_padding" >
</RelativeLayout>
<ListView
android:id="@+id/drawer_list"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_gravity="right"
android:layout_alignParentTop="true"
android:background="@color/setting_background"
android:cacheColorHint="@android:color/transparent"
android:choiceMode="singleChoice"
android:divider="@color/news_list_divider_color"
android:dividerHeight="@dimen/news_list_divider_height"
/>
</android.support.v4.widget.DrawerLayout>
5 réponses
Définit dynamiquement la largeur de ListView...
mDrawerLayout = (DrawerLayout) view.findViewById(R.id.drawer_layout);
mDrawerList = (ListView) view.findViewById(R.id.top_sectionlist);
int width = getResources().getDisplayMetrics().widthPixels/2;
DrawerLayout.LayoutParams params = (android.support.v4.widget.DrawerLayout.LayoutParams) mDrawerList.getLayoutParams();
params.width = width;
mDrawerList.setLayoutParams(params);
Vous devez calculer manuellement la taille de l'écran et définir la largeur dynamique sur la disposition du tiroir au moment de l'exécution, voici comment obtenir la largeur et la hauteur de l'écran de l'appareil au moment de l'exécution
En utilisant ce code, vous pouvez obtenir la largeur et la hauteur de l'affichage d'exécution
DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int height = displaymetrics.heightPixels;
int width = displaymetrics.widthPixels;
Maintenant, vous devez diviser la largeur par 2
int newWidth=width/2;
Maintenant, définissez width sur ListView comme ceci
drawer_list.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,newWidth));
Cela fonctionnera pour tous les appareils et donnera une taille uniforme pour tous.
Voici ma solution pour les autres qui ont besoin de plusieurs pourcentages pour y montrer le tiroir de navigation.
Ici, j'utilise le tiroir de navigation à droite et je montre 15% de l'écran d'accueil lorsque le tiroir se déplace à gauche.
// convert your offset percent (here 15% ) into decimal by dividing 100
float offset = .15f * getResources().getDisplayMetrics().widthPixels ;
float width = getResources().getDisplayMetrics().widthPixels - offset;
DrawerLayout.LayoutParams params = (android.support.v4.widget.DrawerLayout.LayoutParams) rightNavigationView.getLayoutParams();
params.width = (int) width;
rightNavigationView.setLayoutParams(params);
En utilisant la nouvelle bibliothèque de conception de support Android, vous pouvez utiliser le android.support.percent.PercentRelativeLayout
pour accomplir cela facilement. Voici ma solution.
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
android:id="@+id/drawer_layout"
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:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginRight="-64dp"
android:fitsSystemWindows="true"
tools:openDrawer="start">
<include
layout="@layout/content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginRight="64dp"/>
<android.support.percent.PercentRelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="start"
>
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:fitsSystemWindows="true"
app:layout_widthPercent="50%"
app:headerLayout="@layout/nav_header_dashboard"
app:menu="@menu/menu_drawer_activity_dashboard"/>
</android.support.percent.PercentRelativeLayout>
</android.support.v4.widget.DrawerLayout>
Si vous vous demandez pourquoi il y a un android:layout_marginRight="-64dp"
et android:layout_marginRight="-64dp"
dans le DrawerLayout
et le contenu. C'est à cause de la marge fixe de 64 dp qui est codée directement sur le DrawerLayout
qui ne vous permettrait pas d'utiliser une largeur complète du tiroir. Plus à ce sujet ici
int currentVerion = Build.VERSION.SDK_INT;
int width= 0;
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
if(currentVerion >= Build.VERSION_CODES.BASE) {
display.getSize(size);
width = size.x;
}
else
{
width = display.getWidth();
}
((ListView) view.findViewById(R.id.top_sectionlist)).getLayoutParams().width =width/2;