2014-01-10 6 views
21

Ich möchte die Schublade Liste auf die Hälfte des Bildschirms für alle anderen Gerät zu öffnen. Ich habe hart codierte Werte für layout_marginelefle 200dp oder 100dp in die Liste der Schubladen probiert. aber es funktioniert nicht in allen Geräten, es unterscheidet sich von Gerät zu Gerät. Also wie kann ich genau die Hälfte des Bildschirms für die Liste halten? Ich habe auch verschiedene Funktionen wie setLeft (int) usw. ausprobiert, aber einige von ihnen funktioniert nicht, weil ich mindestens Version 8 verwende. Also bitte hilf mir. Danke im Voraus.Android-Set Navigationsleiste Liste zu öffnen genau die Hälfte des Bildschirms für alle Gerät Bildschirm

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

xml dafür:

<?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> 

Antwort

65

stellen Sie die Breite für 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); 
+0

Danke, es funktioniert gut –

+4

Wenn Ihr listView in ein anderes Layout eingebettet ist, das ein Kind der DrawerLayout ist, habe ich festgestellt, dass Sie die neuen Layout-Parameter auf diesem Wrapping-Layout festlegen. Tun Sie alles, was diese Antwort sagt, aber verwenden Sie gegebenenfalls den übergeordneten Container der listView. – jstewart379

+1

Ich bekomme eine Ausnahme von der Klasse. Wie kann ich fortfahren? – GvSharma

6

Sie auf manuelle haben berechnen die Bildschirmgröße und stellen dynamische Breite der Schublade Layout zur Laufzeit, hier ist, wie Gerät Bildschirm Breite und Höhe zur Laufzeit erhalten

diesen Code verwenden Sie & Höhe Breite der Laufzeit-Anzeige

DisplayMetrics displaymetrics = new DisplayMetrics(); 
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); 
int height = displaymetrics.heightPixels; 
int width = displaymetrics.widthPixels; 
bekommen Jetzt

, müssen Sie von 2

int newWidth=width/2; 

Nun setzen Breite die Breite teilen ähnliche

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

zur Listenansicht Diese Geräte für alle arbeiten und einheitliche Größe für alle geben. dynamisch

+0

danke für die gut erklärte Antwort .i habe, dass –

+0

tun upvote die Antwort, hat die Lösung funktioniert? –

+0

Über Lösung ist für mich gearbeitet, aber ich habe verstanden, was genau zu tun ist von Ihrer Antwort. –

0
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; 
1

die neue Android-Support Design Bibliothek verwenden, können Sie die Verwendung des android.support.percent.PercentRelativeLayout um dies zu erreichen leicht zu machen. Hier ist meine Lösung.

<?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> 

Wenn Sie sich fragen, warum in der DrawerLayout ein android:layout_marginRight="-64dp" und android:layout_marginRight="-64dp" es gibt und den Inhalt. Es ist wegen der festen Marge von 64 dp, die direkt an die DrawerLayout codiert ist, die Ihnen nicht erlauben würde, eine volle Breite der Schublade zu verwenden. Mehr dazu here

+0

Dies ist eigentlich eine richtige Antwort.Nicht wegen PercentRelativeLayout, 50% kann auf verschiedene gleichermaßen korrekte Weisen, aber wegen -64dp Aussage erhalten werden, da es die Inhaltsbewegung verursacht. Allerdings muss -64dp im Inhaltsbereich korrigiert werden. Andernfalls wird der App-Inhalt nach rechts verschoben. – bajicdusko

2

Hier ist meine Lösung für andere, die mehrere Prozent benötigen, um ihre Navigationsschublade anzuzeigen.

Hier benutze ich die richtige Navigation Schublade & ich 15% der Startseite anzeigen, wenn Schublade nach links bewegen.

// 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);