2014-01-10 3 views
21

Я хочу открыть список выдвижных ящиков на половину экрана для всех разных устройств. Я пробовал жестко закодированные значения для layout_margineleft 200dp или 100dp в списке drawerlist. но он не работает во всех устройствах, отличных от устройства к устройству. так как я могу поддерживать ровно половину экрана для списка ярлыков. Я также пробовал различные функции, такие как setLeft (int) и т. д., но некоторые из них не работают из-за того, что я использую минимальную версию 8. Поэтому, пожалуйста, помогите мне. заранее спасибо.Android установить список ящиков навигации, чтобы открыть точную половину экрана для всего экрана устройства

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

XML для этого:

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

ответ

65

установить ширину 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

благодарит свои работы –

+4

Если ваш listView встроен в другой макет, который является дочерним элементом DrawerLayout, я обнаружил, что вы устанавливаете новые макеты макета на этот макет упаковки. Делайте все, что говорит этот ответ, но при необходимости используйте родительский контейнер listView. – jstewart379

+1

Я получаю класс литые исключения здесь .. как я могу продолжить? – GvSharma

6

Вы должны руководство рассчитать размер экрана и установить динамическую ширину в макет ящика во время выполнения, то здесь, как получить экран устройства ширины и высоты во время выполнения

Используя этот код вы можете получить во время выполнения-дисплея Ширина & Высота

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

Теперь вам нужно разделить ширину на 2

int newWidth=width/2; 

Теперь установить ширину в ListView, как этот

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

Это будет работать для всех устройств и даст одинаковый размер по всем.

+0

спасибо за хорошо объясненный ответ .i получил, что –

+0

сделать upvote ответ, не решено ли решение? –

+0

Выше решение работает для меня, но я точно понял, что делать с вашего ответа. –

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

Использование нового Android Support Design Library, Вы можете сделать использование android.support.percent.PercentRelativeLayout для достижения этой цели легко. Вот мое решение.

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

Если вы спрашиваете, почему есть android:layout_marginRight="-64dp" и android:layout_marginRight="-64dp" в DrawerLayout и содержание. Это связано с фиксированным запасом 64 дп, который закодирован непосредственно на DrawerLayout, что не позволит вам использовать полный widtt ящика. Подробнее об этом here

+0

Это на самом деле правильный ответ.Не из-за PercentRelativeLayout, 50% можно получить разными одинаково корректными способами, но из-за инструкции -64dp, так как это то, что вызывает движение контента. Однако -64dp необходимо скорректировать в области содержимого. В противном случае содержимое приложения будет смещено вправо. – bajicdusko

2

вот мое решение для других, которым требуется несколько процентов, чтобы показать там навигационный ящик.

Здесь я использую правый навигационный ящик & Я показываю 15% экрана дома, когда выдвижной ящик перемещается влево.

// 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); 
Смежные вопросы