Ich möchte die Schubladenliste für die verschiedenen Geräte auf der Hälfte des Bildschirms öffnen. Ich habe hartcodierte Werte für layout_margineleft 200dp oder 100dp in der Schubladenliste ausprobiert. aber es funktioniert nicht in allen Geräten, es unterscheidet sich von Gerät zu Gerät. Wie kann ich also genau die Hälfte des Bildschirms für die Schubladenliste verwalten? Ich habe auch verschiedene Funktionen wie setLeft (int) usw. ausprobiert, aber einige von ihnen funktionieren nicht, da ich Mindestversion 8 verwende. Helfen Sie mir bitte. Danke im Voraus.
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>
die Breite für ListView dynamisch einstellen ...
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);
Sie müssen die Bildschirmgröße manuell berechnen und die dynamische Breite zur Laufzeit an das Schubladenlayout anpassen. Im Folgenden erfahren Sie, wie Sie die Bildschirmbreite und -höhe des Geräts zur Laufzeit erhalten
Mit diesem Code können Sie Breite und Höhe der Laufzeitanzeige abrufen
DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int height = displaymetrics.heightPixels;
int width = displaymetrics.widthPixels;
Nun müssen Sie die Breite durch 2 teilen
int newWidth=width/2;
Stellen Sie nun die Breite auf ListView so ein
drawer_list.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,newWidth));
Dies funktioniert für alle Geräte und ergibt eine einheitliche Größe für alle Geräte.
hier ist meine Lösung für andere, die mehrere Prozent benötigen, um ihre Navigationsleiste anzuzeigen.
Hier verwende ich die rechte Navigationsleiste und zeige 15% des Startbildschirms, wenn sich die Schublade nach links bewegt.
// 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);
Mit der neuen Android Support Design Library können Sie den Android.support.percent.PercentRelativeLayout
verwenden, um dies einfach zu erreichen. 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 fragen, warum es einen Android:layout_marginRight="-64dp"
und Android:layout_marginRight="-64dp"
in der DrawerLayout
und den Inhalt gibt. Der fest definierte Rand von 64 dp, der direkt in die DrawerLayout
codiert ist, erlaubt es nicht, eine volle Breite der Schublade zu verwenden. Mehr dazu hier
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;