Установить поле для автономного просмотра

Это может быть просто плохой практикой, но графический интерфейс Android, как всегда, меня расстраивает. У меня есть это автономное представление, называемое primary_button в res/layout:

<?xml version="1.0" encoding="utf-8"?>
<Button xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content" android:layout_height="wrap_content"
    android:background="@drawable/primary_button"
    android:textColor="@color/light_warm_gray"/>

и его настраиваемая фоновая форма «primary_button» в res/drawable:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
   android:shape="rectangle">
   <solid android:color="@color/light_olive" />
   <corners android:radius="10dp"/>
   <size android:height="40dp" android:width="40dp" />
</shape>

Теперь проблема в том, что когда я устанавливаю layout_margin равным 10dp, ничего не устанавливается, потому что в тот момент, когда я надуваю эту строку:

Button b = (Button)View.inflate(this, R.layout.primary_button, null);

у него нет родительского макета (очевидно, необходимо установить параметры макета). Мне нужен аккуратный код, а постоянное задание *Layout.LayoutParams в коде — это боль.

Заполнение формы и заполнение кнопок делали не то, что я хотел, а то, для чего они предназначены. (В этом случае они просто увеличили форму кнопки)

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

Интересно, как с этим справляются стоковые кнопки. Я имею в виду, что они просто оставляют хороший запас между ними (около 15 dp?) без необходимости устанавливать параметры макета. Разве это не должно происходить и с пользовательским представлением?


person venge    schedule 29.04.2015    source источник
comment
Добавьте код, который вы используете для надувания кнопки   -  person hasan    schedule 29.04.2015


Ответы (1)


Попробуйте следующее:

View.inflate(this, R.layout.primary_button, parentView);

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

person hasan    schedule 29.04.2015
comment
нет, друг мой, я только что проверил. Родительское представление представляет собой linearLayout, в данном случае называемое ll, поэтому я использовал его следующим образом: Button b = (Button)View.inflate(this, R.layout.primary_button, ll); . Это дает мне недопустимое исключение приведения (пытается применить linearLayout к кнопке) внутри android.app.ActivityThread.performLaunchActivity. - person venge; 29.04.2015
comment
нет, опять. Используя только этот простой оператор View.inflate(this, R.layout.primary_button, parentView);, исключение приведения все еще происходит (потому что оно выдается в Android, а не в моем коде). Таким образом, это не приведение возвращаемого вида к кнопке, а линейный макет, который будет приведен к кнопке из класса LayoutInlfater. - person venge; 29.04.2015
comment
это сработало, мой друг, у меня была еще одна забытая кнопка внизу. извините, что беспокою вас больше! - person venge; 29.04.2015