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>
23
demandé sur Mayur Raval 2014-01-10 11:00:59

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);
68
répondu Gopal Gopi 2014-01-10 07:08:40

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.

7
répondu Akhil Jain 2014-01-10 07:06:48

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);
3
répondu Shihab Uddin 2016-10-27 15:42:54

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

1
répondu gentra 2017-05-23 12:17:36
 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;
0
répondu Ahmad Moussa 2016-01-06 05:02:57