2012-01-06 5 views
0

Я хочу настроить кнопки для моего приложения. Приложение имеет выбор цвета, в котором пользователь будет выбирать цвет, и я должен установить этот цвет начала/конца для кнопок. Эти значения colro будут храниться в объекте «Утилита».android: Пользовательская кнопка с динамическими значениями

В основном от начала, я хочу использовать объект «Утилита» для установки цветов для фона, цвета текста, шрифта и т. Д. И снова, когда цвет изменяется пользователем, я должен изменить его на кнопки и обновить их. А также для сохранения цветов в файле, поэтому в следующий раз, когда пользователь запустит приложение, он отображает последний выбранный цвет.

Я не мог найти <selector>, чтобы быть лучшим вариантом, так как я не смогу изменить цвет в xml. Что может быть лучшим вариантом для такого требования?

ОБНОВЛЕНИЯ: @jitendra, из вашего ответа я получил некоторое полезное значение. Я использую GradientDrawable для установки цветов моих кнопок. В моем onCreate() Activity я вызываю метод RefreshComponents(), который устанавливает фон корня, цвет текста/размер кнопок и цвета градиента кнопок. Он работает нормально, но единственная проблема, которую я вижу, - это применение GradientDrawable к кнопке, что разрыв между двумя кнопками теряется.

Это изображение без применения GradientDrawable: enter image description here

Применив GradientDrawable выход является: enter image description here

Вы видите размер кнопки увеличивается немного со всех сторон. Если я применим и к следующей кнопке, они оба касаются друг друга. Мой XML для выше:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/mainroot" android:layout_width="fill_parent"  
    android:layout_height="fill_parent" android:orientation="vertical" 
    android:paddingTop="35dip" android:paddingBottom="35dip" 
    android:paddingLeft="35dip" android:paddingRight="35dip"android:gravity="center" > 

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/mainrow1" android:layout_width="fill_parent" 
     android:layout_height="wrap_content" android:orientation="horizontal" 
     android:layout_marginBottom="15dip" android:gravity="center_horizontal" > 
     <Button android:text="Accounting" android:id="@+id/accBtn" android:layout_width="80dip" style="@style/TileButtonStyle" /> 
     <Button android:text="Data" android:id="@+id/dataBtn" android:layout_width="80dip" android:layout_height="fill_parent"></Button> 
     <Button android:text="Information" android:id="@+id/infoBtn" android:layout_width="80dip" android:layout_height="fill_parent" android:ellipsize="end"></Button> 
    </LinearLayout> 
    ..... Other lineasr layout with same parameters as above child 

И GradientDrawable, что я создаю это:

public static GradientDrawable getButtonDrawable(Button btn) { 
    int colors[] = {getStartColor(), getEndColor()}; 
    GradientDrawable grad = new GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT, colors); 
    grad.setCornerRadius(5f); 
    return grad; 
} 

И, наконец, в моем OnCreate(), я добавляю:

GradientDrawable btnGradient = Utility.getButtonDrawable(btn1); 
btn1.setBackgroundDrawable(btnGradient); 

Что происходит Неправильно здесь? Является ли маржа вокруг кнопки 0? Должен ли я устанавливать границы для градиента или снова устанавливать LayoutParams для кнопки?

Любая помощь с благодарностью поможет мне достичь своей цели.

Благодаря

+0

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

+0

@jitendrasharma, моя следующая цель - динамически изменять размер макета, который должен автоматически изменять размеры кнопок. Посмотрите и попробуйте помочь - http://stackoverflow.com/questions/8769491/android-retrieve-layout-marginbottom-programmatically – Tvd

+0

@jitendrasharma, я не планирую менять LAyoutParams каждой кнопки. Выше было всего лишь точка. Но на самом деле добавление marginRight к кнопкам выполняло только работу. Удивление их должно быть чем-то другим, или я могу ошибаться где-то, но не могу его найти. – Tvd

ответ

0

О, я получил решение:

я добавил layout_marginRight атрибут к кнопкам и сделал работу.

Хотя я по-прежнему обеспокоен, без GradientDrawable кнопки имели margin betweenthem, а затем после применения GradientDrawable, почему разница по умолчанию потеряна? Почему необходимо добавить дополнительный layout_marginRight?

Если у кого-либо еще есть ответ на этот вопрос, пожалуйста, дайте мне знать.

Благодаря

+0

Я не видел ваш обновленный вопрос, но теперь я это сделал. Почему бы вам не уменьшить наложение? Это может помочь. – Ghost

+0

@Ghost, Да, это то, что я сделал, добавляя дополнительные дополнения для корневого макета и marginRight для кнопок. Но удивительно, почему размер увеличивается после реализации GradientDrawable. И НЕ ИСПОЛЬЗУЕТ любой paddign в любой из кнопок или внутренней компоновки, тогда где я его уменьшу ??? – Tvd

+0

Извините! Не заметил этого. Ну, я не знаю ничего лучше. Угадайте, вам придется делать больше исследований. – Ghost

0

Android имеет Themes and Styles, но они являются характерной чертой развития времени и не могут манипулировать во время выполнения. Однако во время выполнения могут использоваться разные предопределенные темы.

Таким образом, вы можете иметь набор предопределенных тем с фиксированными свойствами вида (цвета, шрифты и т. Д.) И дать пользователю возможность выбрать тему во время выполнения.

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

+0

предопределенные Темы также не допускаются. Каждая вещь должна быть чистой динамикой - независимо от того, какой пользователь выбирает - фон, 2 цвета градиента, цвет текста и т. Д. Можете ли вы больше сосредоточиться на своей рег-рег-рулоне вашей собственной тематической системы ». – Tvd

+0

@Tvd: вы имели в виду, что «предопределенные темы не разрешены» в вашем приложении или в андроиде вообще? –

+0

в моем приложении. Как сказано, все должно быть динамическим, основанным на выборе пользователя, поэтому в предопределенном состоянии нет места в нем. – Tvd

1

Вы можете создать объект StateListDrawable Object динамически в java-файле и установить в качестве фона и источников компонентов applcation.

+0

Мне не нужны разные стили для разных состояний, поэтому вместо использования StateListDrawable я пробовал работать с GradientDrawable. Но размер кнопки изменяется. Посмотрите мой обновленный вопрос. – Tvd

0

Tvd!Я склонен согласиться с Питером Кнего и Джитдер Шармой. Кроме того, я думаю/верю, что вы можете setOnClickListener на ваших ваших кнопках и выполнить свой цвет с помощью кода, который лежит внутри метода setOnClickListener, назначенного каждой кнопке. В дополнение к этому вам придется настроить свой файл color.xml и настраиваемые темы. Проделать много работы. Я не уверен, что это лучший способ. Я настоятельно рекомендую вам ознакомиться с материалами, которые я вам предоставил в своем previous answer. Только они могут дать вам подробное представление и прочную идею идти вперед. Всего наилучшего!

+0

Итак, могу ли я изменить «colors.xml» во время выполнения? Если ничего не работает, то, конечно, я должен написать код в методе onCreate (я думаю) каждого Activity, где я задал все свойства на основе сохраненных в объекте Utility. Как и btn1.setTextColor (Utility.getTextColor()). Учебный материал, который вы предоставили в предыдущем ответе, содержит ссылки на книги, и я не могу этого себе позволить. – Tvd

+0

@Tvd: вы не редактируете файлы ресурсов во время выполнения (colors.xml и т. Д.). –

+1

@Tvd: Просто Google ищет эти книги. Все они доступны для бесплатной загрузки. Вот как я загрузил. Если вы не можете найти их в любом месте, укажите мне свой идентификатор почты, если вы считаете, что это безопасно. Я отправлю их вам. Что касается изменения ресурсов, вы не можете сделать это во время выполнения. Это бесполезно, если вы это сделаете. – Ghost

Смежные вопросы