web-dev-qa-db-fra.com

Android a défini la liste des tiroirs de navigation pour ouvrir la moitié exacte de l'écran pour tous les écrans

Je veux ouvrir la liste des tiroirs à la moitié de l'écran pour tous les appareils. J'ai essayé des valeurs codées en dur pour layout_margineleft 200dp ou 100dp dans la liste des tiroirs. mais cela ne fonctionne pas dans tous les appareils, il diffère d'un appareil à l'autre. Alors, comment puis-je maintenir exactement la moitié de l'écran pour tiroirlist. J'ai aussi essayé diverses fonctions comme setLeft (int), etc.mais certaines d'entre elles ne fonctionnent pas car j'utilise la version 8 minimum. Merci d'avance. 

    mDrawerLayout = (DrawerLayout) view.findViewById(R.id.drawer_layout);
    mDrawerList = (ListView) view.findViewById(R.id.top_sectionlist);

xML pour cela:

<?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>
24
Mayur Raval

définir la largeur pour ListView dynamiquement ...

    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
Gopal Gopi

Vous devez calculer manuellement la taille de l'écran et définir la largeur dynamique à la disposition du tiroir au moment de l'exécution. Voici comment obtenir la largeur et la hauteur de l'écran du périphérique au moment de l'exécution

En utilisant ce code, vous pouvez obtenir la largeur et la hauteur de l'affichage du runtime

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, réglez la largeur sur ListView comme ceci

drawer_list.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,newWidth));

Cela fonctionnera pour tous les appareils et donnera une taille uniforme à tous.

7
Akhil Jain

voici ma solution pour ceux qui ont besoin de plusieurs pourcentages pour afficher leur tiroir de navigation. 

Ici, j'utilise le tiroir de navigation de droite et affiche 15% de l'écran d'accueil lorsque le tiroir se déplace vers la 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
Shihab Uddin

À l'aide de la nouvelle bibliothèque de support technique 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 un Android:layout_marginRight="-64dp" dans le DrawerLayout et le contenu. C’est en raison de la marge fixe de 64 dp codée directement dans DrawerLayout qui ne vous permet pas d’utiliser toute la largeur du tiroir. Plus à ce sujet ici

1
gentra
 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
Ahmad Moussa