Изменить размер/положение элементов в списке слоев программно

У меня есть файл pasek_postepu.xml, который я использую в качестве фона представления в activity_add.xml. pasek_postepu.xml представляет собой список слоев, содержащий 2 элемента: прямоугольники.

activity_add.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 
    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"
    tools:context=".AddActivity"
    android:background="@color/background">

    <View
        android:id="@+id/pasek_postepu_dodawanie"
        android:layout_width="match_parent"
        android:layout_height="10dp"
        android:layout_margin="5dp"
        android:layout_marginStart="8dp"
        android:layout_marginEnd="8dp"
        android:background="@color/pasek_postepu"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>

pasek_postepu.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/pasek_postepu_1_element"
        android:left="20dp"
        android:right="200dp">
        <shape android:shape="rectangle">
            <solid android:color="@color/red"/>
        </shape>
    </item>
    <item
        android:id="@+id/pasek_postepu_2_element"
        android:left="200dp"
        android:right="20dp">
        <shape android:shape="rectangle">
            <solid android:color="@color/green"/>
        </shape>
    </item>
</layer-list>

Я хочу программно установить размер каждого из них в зависимости от ширины экрана, чтобы каждый из них занимал 1/2 экрана, включая поля и некоторое пространство между ними, скажем, 10dp. Я уже извлек ширину экрана в int dpWidth, так что это не проблема. Это мой java-файл:

AddActivity.java

package com.example.kamil.math;

import android.annotation.SuppressLint;
import android.app.Dialog;
import android.graphics.Color;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.LayerDrawable;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;

public class AddActivity extends AppCompatActivity {
private static int ilosc;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add);
        ChangeSize();
    }

    @SuppressLint("ResourceAsColor")
    public void ChangeSize(int ktory_cykl){
        LayerDrawable pasek = (LayerDrawable)getResources().getDrawable(R.drawable.pasek_postepu);
        GradientDrawable pasek1 = (GradientDrawable) pasek.findDrawableByLayerId(R.id.pasek_postepu_1_element);
        GradientDrawable pasek2 = (GradientDrawable) pasek.findDrawableByLayerId(R.id.pasek_postepu_2_element);
        pasek1.setColor(Color.rgb(31,135,31)); //green
        pasek2.setColor(Color.rgb(196,32,32)); //red

        View pasek_id = findViewById(R.id.pasek_postepu_dodawanie);
        pasek_id.setBackground(getApplicationContext().getResources().getDrawable(R.drawable.pasek_postepu));
    }
}

Я могу «получить доступ» к каждому элементу и изменить его цвет, но не вижу способа изменить размер. Я пытался изменить Left и Right, например. pasek1.setLeft(...); но получаю сообщение "не удается разрешить символ setLeft". Я не могу использовать width, потому что он работает на Android 6+, а мне нужна совместимость с Android 5.

Есть ли способ установить размер каждого элемента формы java-файла?


person K.Mat    schedule 17.11.2018    source источник


Ответы (1)


вместо constraintLayout используйте LinearLayout
в LinearLayout есть атрибут с именем android:weightSum

вот пример

<LinearLayout
    android:background="@color/DarkGoldenrod"
    android:layout_height="0dp"
    android:layout_width="match_parent"
    android:layout_weight="2" />
<TextView
    android:background="#00FF00"
    android:layout_height="0dp"
    android:layout_width="match_parent"
    android:layout_weight="1" />

<TextView
    android:background="@color/red"
    android:layout_height="0dp"
    android:layout_width="match_parent"
    android:layout_weight="1" />

задав weightSum = 2 и задав каждому TextView = 1
, каждый из них будет занимать одинаковое количество места независимо от размера устройства.

вот ссылка для получения дополнительной информации

person Kevin Kurien    schedule 17.11.2018
comment
Насколько мне известно, я не могу установить файл макета в качестве фона - person K.Mat; 18.11.2018
comment
O хотите установить цвет каждой части в зависимости от того, был ли ответ хорошим или нет. Примерно так: drive.google.com/file/d/ 1NPQLKlHHKibjsEj5CMHeggiJ-reZWYjF/ Я не знаю, как изменить фон индикатора выполнения, поэтому решил сделать 10 отдельных элементов в списке слоев. - person K.Mat; 19.11.2018