Подтвердить что ты не робот

Android устанавливает список навигационных ящиков, чтобы открыть точную половину экрана для всего экрана устройства

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

    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>
4b9b3361

Ответ 1

установить ширину для 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);

Ответ 2

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

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

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

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

Ответ 3

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

Здесь я использую правый навигационный ящик, и я показываю 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);

Ответ 4

Используя новую библиотеку дизайна поддержки Android, вы можете использовать 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 ящика. Подробнее об этом здесь

Ответ 5

 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;