2013-09-22 7 views
0

Итак, ребята, я читал, что просто невозможно установить стиль view через Java. Такого метода еще нет myView.setStyle("styleName").Styling Views, созданный программно на Android

Тогда, когда вы создаете свои элементы макета по коду, например textvews, и imageviews или linearlayouts в качестве контейнера, как вы их устанавливаете? Вы назначаете правило по правилу каждого вновь созданного элемента? Или есть более эффективный способ выполнения этой задачи?

@EDIT

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

ответ

0

Вы можете использовать темы и стили

Тема может применяться ко всему приложению, указав название темы в Android явить

например <application android:theme="@style/CustomTheme">

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

Существуют различные предопределенные темы Голос Свет и Голо Темные - более распространенные темы. Большинство приложений начинаются с создания новой темы, которая унаследована от одной из вышеуказанных тем и, при необходимости, переопределяет определенные элементы.

Лучшее, что нужно сделать, это обратиться к документации, которая всегда должна быть вашим первым портом захода.

http://developer.android.com/guide/topics/ui/themes.html

+3

Его вопрос: «Стили, созданные программно на Android», а не через файлы XML. – prijupaul

+2

@prijupaul виджеты, созданные в коде, подбирают тему, примененную к объявлению приложения в манифесте. Стили могут применяться как в коде, так и в XML, Темы и стили должны быть созданы как XML-документы. Так в чем ваш смысл? – jamesc

1

Вы можете унаследовать вид вы хотите стиль и передать стиль, который вы хотите применить во время выполнения. Что-то вроде класса ниже, который просто устанавливает пользовательский шрифт в TextView. В основном, вам нужно заглянуть в третий конструктор, где вы можете поставить свой стиль.

public class TextViewRoboto extends TextView { 

    public TextViewRoboto(Context context) { 
     super(context); 
    } 

    public TextViewRoboto(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     setCustomFont(context, attrs); 
    } 

    public TextViewRoboto(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     setCustomFont(context, attrs); 
    } 

    private void setCustomFont(Context ctx, AttributeSet attrs) { 
     setCustomFont(ctx, "roboto-light.ttf"); 
    } 

    public boolean setCustomFont(Context ctx, String asset) { 
     Typeface tf = null; 
     try { 
      tf = Typefaces.get(ctx, asset); 
     } catch (Exception e) { 
      Logger.e("Could not get typeface: " + e.getMessage()); 
      return false; 
     } 

     setTypeface(tf); 
     return true; 
    } 

} 
+0

и как я могу ссылаться на стиль? Я имею в виду, что я должен передать конструктору как defStyle? например, если я установил стиль 'myStyle' в styles.xml, как мне его использовать в конструкторе? –

+2

Вы можете указать стиль с R.style.myStyle. Вам нужно заменить элемент TextView в вашем XML с полным именем вашего подкласса TextView! –

+0

@NitinSethi Нет, вы не можете. Посмотрите https://code.google.com/p/android/issues/detail?id=12683#c15 –

2

Каждый вид или его подкласс имеет третий конструктор, который принимает аргумент Style. Например, this конструктор View. Упомяните идентификатор ресурса стиля для этого представления и, следовательно, его следует упомянуть при создании представления.

Из документации

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

1

Решение, которое я нашел Цель состоит в том, чтобы создать элементы программно, которые ранее были в стиле где-то еще.

Во-первых, я создал новый файл XML в папке res/layout. Я назвал его template.xml и вставил в него следующий код:

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    style="@style/rootElement" 
    > 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/firstChildId" 
     style="@style/firstChild" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     style="@style/secondChild" /> 

</LinearLayout> 

А потом я стиль тогда, как я хотел в стилей.XML-файл

<resources xmlns:android="http://schemas.android.com/apk/res/android"> 
    <style name="rootElement"> 
     <!-- style -->   
    </style> 

    <style name="firstChild"> 
     <!-- style -->  
    </style> 
</resources> 

Теперь в моем классе активность я добавил:

LinearLayout rootElement = (LinearLayout) getLayoutInflater().inflate(R.layout.template, null); 
someOtherView.addView(rootElement); 

инфлятор загрузит шаблон, который мы создали в Рез/макет/template.xml (все элементы в этом файле и его атрибуты) и назначить его rootElement, который затем используется в моем коде для чего-либо еще. Пример

TextView firstChild = (TextView) rootElement.getChildAt(0); 
firstChild.setText("It is the firstChild element"); 

или

TextView firstChild = (TextView) rootElement.findViewById(R.id.firstChildId); 
... 

Довольно просто, не так ли ?! Надеюсь, что поможет

+1

... и как это программно? Ответ праюпула правильный. Улов: вы можете применять стиль только при создании экземпляра объекта/элемента представления, после чего вы можете изменять свойства один за другим, но не можете применять полный стиль. –

+1

Это то, что он имеет в виду: новый TextView (это, null, R.style.firstChild), затем установите соответствующие LayoutParams, и все готово. –

+1

его ответ может быть правильным (и я надеюсь, что это поможет другим людям). Я добавляю решение, которое я нашел/использую. это «программно», потому что элемент был создан во время выполнения и I и ссылается на существующий стиль. Я создал этот учебник, потому что я нашел примеры довольно трудными для новичков, и я видел некоторых людей с тем же мнением, комментируя темы. –

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