2016-11-30 3 views
1

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

Я вижу, есть набор minimumWidth api. Но каков правильный номер? Должен ли я получить родительскую ширину, а затем просто вычислить процент и ширину дочернего элемента и передать это как minimumWidth.

В качестве альтернативы, это что-то достижимое только с кодом xml layout?

ответ

2

Классы от android.support.percent.*, такие как PercentRelativeLayout, в настоящее время устарели

Этот класс устарел в уровне API 26.1.0.
рассмотрите вместо этого использование ConstraintLayout и связанных макетов. Ниже показано, как копировать функции процентных макетов с помощью ConstraintLayout. Руководство используются для определения каждой точки в процентах разрыва, а затем вид кнопки растягивается, чтобы заполнить пробел:

Просто используйте ConstraintLayout с GuideLines

Пример:

<android.support.constraint.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

<android.support.constraint.Guideline 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/left_guideline" 
    app:layout_constraintGuide_percent=".15" 
    android:orientation="vertical"/> 

<android.support.constraint.Guideline 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/right_guideline" 
    app:layout_constraintGuide_percent=".85" 
    android:orientation="vertical"/> 

<android.support.constraint.Guideline 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/top_guideline" 
    app:layout_constraintGuide_percent=".15" 
    android:orientation="horizontal"/> 

<android.support.constraint.Guideline 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/bottom_guideline" 
    app:layout_constraintGuide_percent=".85" 
    android:orientation="horizontal"/> 

<Button 
    android:text="Button" 
    android:layout_width="0dp" 
    android:layout_height="0dp" 
    android:id="@+id/button" 
    app:layout_constraintLeft_toLeftOf="@+id/left_guideline" 
    app:layout_constraintRight_toRightOf="@+id/right_guideline" 
    app:layout_constraintTop_toTopOf="@+id/top_guideline" 
    app:layout_constraintBottom_toBottomOf="@+id/bottom_guideline" /> 

</android.support.constraint.ConstraintLayout> 
1

Это достижимо без какого-либо кода с использованием весов в LinearLayout, следующим образом:

<LinearLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:weightSum="10" 
     android:orientation="horizontal"> 

    <ProgressBar 
     android:layout_widthPercent="0dp" 
     android:layout_heightPercent="wrap_content" 
     android:weight="1"/> 
</LinearLayout> 

И потому, что родитель имеет общую сумму 10 единиц, и ребенок будет принимать только 1 из них, ребенок фактически будет иметь 10% от ширины родительского элемента.

Также возможно использовать мощность библиотеки поддержки через PercentRelativeLayout. Основное применение заключается в следующем:

<android.support.percent.PercentRelativeLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

    <ProgressBar 
     app:layout_widthPercent="50%" 
     app:layout_heightPercent="wrap_content" 
     app:layout_marginTopPercent="10%"/> 

</android.support.percent.PercentRelativeLayout> 

Чтобы добавить его в свой проект, вам нужно будет включать в себя библиотеку поддержки percent в вашем проекте. Для этого, включите следующую строку в файл build.gradle

compile 'com.android.support:percent:{lastest_support_library_version}' 
0

Это sould быть сделано из кода, а не из XML.

Посмотрите на фрагмент кода:

ProgressBar view_instance = (ProgressBar)findViewById(R.id.nutrition_bar_filled); 
LayoutParams params=view_instance.getLayoutParams(); 
params.width=newOne; 
view_instance.setLayoutParams(params); 

Теперь, позволяет сказать, что ваш XML выглядит следующим образом:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal"> 
    <ProgressBar 
android:layout_width="wrap_content" 
    android:layout_height="wrap_content"/> 
</LinearLayout> 

Вы будете использовать код, приведенный выше, как это:

ProgressBar view_instance = (ProgressBar)findViewById(R.id.nutrition_bar_filled); 
LinearLayout.LayoutParams params=(LinearLayout.LayoutParams)view_instance.getLayoutParams(); 
params.width= yourLinearLayout.getWidth()/100 * percent; 
view_instance.setLayoutParams(params); 
Смежные вопросы