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>
Ответы
Ответ 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;