Добавление темы в Seekbar программным способом приводит к исчезновению Seekbar - PullRequest
2 голосов
/ 16 января 2020

Мне нужно добавить переменное количество Seekbars в зависимости от конфигурации.

for(int i=0;i<length;i++){

            seeks[i] = new SeekBar(getActivity());
            seeks[i].setMax(4);
            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            layoutParams.setMargins(30,30,30,30);
            seeks[i].setLayoutParams(layoutParams);
            ll.addView(seeks[i]);
            seeks[i].setVisibility(View.VISIBLE);

Работает отлично, но я бы хотел, чтобы Seekbar был дискретным. В XML вы можете просто добавить:

<SeekBar
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/Base.Widget.AppCompat.SeekBar.Discrete"/>

Однако, если я буду следовать Документам, вы сможете добавить тему в конструктор Seekbar следующим образом:

seeks[i] = new SeekBar(getActivity(), null, R.style.myTheme2 );

где я установил тему в стилях. xml, ИЛИ

seeks[i] = new SeekBar(getActivity(), null, R.style.Widget_AppCompat_SeekBar_Discrete);

Однако, как только я сделаю одну из этих вещей, панель поиска полностью исчезнет из вида.

Ответы [ 2 ]

0 голосов
/ 16 января 2020

когда вы используете XML, он фактически устанавливает какой-либо атрибут по умолчанию. он расположен в core / res / res / values / styles.xml

<style name="Widget.SeekBar">
        <item name="android:indeterminateOnly">false</item>
        <item name="android:progressDrawable">@android:drawable/progress_horizontal</item>
        <item name="android:indeterminateDrawable">@android:drawable/progress_horizontal</item>
        <item name="android:minHeight">20dip</item>
        <item name="android:maxHeight">20dip</item>
        <item name="android:thumb">@android:drawable/seek_thumb</item>
        <item name="android:thumbOffset">8dip</item>
        <item name="android:focusable">true</item>
    </style>

в то же время, SeekBar(Context context) также использует стиль defalut. Это связано с тем, что вы вызываете тот же метод, который вы вызывали, но устанавливаете стиль по умолчанию.

public SeekBar(Context context) {
        this(context, null);
    }
public SeekBar(Context context, AttributeSet attrs) {
        this(context, attrs, com.android.internal.R.attr.seekBarStyle);
    }

, поэтому измените свою тему, расширяйте ее. Добавьте свой пользовательский элемент.

seeks[i] = new SeekBar(getActivity(), null, R.style.Widget_AppCompat_SeekBar_Discrete);

здесь дескриптор документа для конструктора из трех параметров:

Выполните инфляцию с XML и примените базовый стиль c, определенный для класса, из атрибута темы. Этот конструктор View позволяет подклассам использовать их собственный базовый стиль, когда они надуваются. Например, конструктор класса Button вызовет эту версию конструктора суперкласса и предоставит R.attr.buttonStyle для defStyleAttr; это позволяет стилю кнопки темы изменять все атрибуты базового представления (в частности, его фон), а также атрибуты класса Button.

0 голосов
/ 16 января 2020

Получил работу, оставив других, у которых возникла такая же проблема, поскольку я нигде не мог ее найти:

Сначала настройте макет для каждого отдельного SeekBar:

seekbar_base. xml

<?xml version="1.0" encoding="utf-8"?>
<SeekBar
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:progressBackgroundTint="@color/seekBarBackground"
    android:progressTint="@color/seekBarProgress"
    android:thumbTint="@color/seekBar"
    android:paddingLeft="20sp"
    android:paddingTop="3dp"
    android:paddingRight="20dp"
    android:paddingBottom="30dp"
    android:theme="@style/Widget.AppCompat.SeekBar.Discrete" />

Затем создайте его экземпляр следующим образом:

SeekBar bar = (SeekBar)LayoutInflater.from(getActivity()).inflate(R.layout.seekbar_base, null);

Я до сих пор не представляю, почему это не сработало так, как сказали в документации, но, о, хорошо.

...