2013-09-22 138 views
0

所以我讀到的人很難通過Java設置view的樣式。目前還沒有這樣的方法myView.setStyle("styleName")在Android上以編程方式創建的樣式視圖

然後,當您通過代碼創建佈局元素(如textvewsimageviewslinearlayouts)作爲容器時,您如何設置它們的樣式?你是否按照每個新創建元素的規則分配規則?還是有更有效的方法來完成這項任務?

@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傳遞給構造函數?例如,如果我在styles.xml中設置了樣式'myStyle',應該如何在構造函數中使用它? –

+2

您可以使用R.style.myStyle來引用樣式。您需要將XML中的TextView元素替換爲TextView子類的完全限定名稱! –

+0

@NitinSethi不,你不能。看看https://code.google.com/p/android/issues/detail?id=12683#c15 –

2

每個視圖或其子類都有一個採用Style參數的第三個構造方法。例如,View的構造函數爲this。提及這個視圖的樣式資源ID,因此它應該在視圖創建過程中提及。

從技術文檔

默認樣式應用到了這一觀點。如果爲0,則不會應用樣式(超出主題中包含的樣式)。這可能是屬性資源,其值將從當前主題中檢索,或者是顯式樣式資源。

1

我發現目標是編程方式創建的元素,以前的風格別的地方的解決方案。

首先,我在res/layout文件夾中創建了一個新的XML文件。我把它命名爲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> 

,在我的活動I類補充說:

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

充氣器將加載我們RES /佈局/ 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

...以及這是如何編程? prijupaul的回答是正確的。該問題:您只能在實例化視圖對象/元素時應用樣式,之後您可以逐個更改屬性,但無法應用完整樣式。 –

+1

這就是他的意思:新的TextView(this,null,R.style.firstChild),然後設置合適的LayoutParams,就完成了。 –

+1

他的回答可能是正確的(我希望它可以幫助其他人)。我正在添加我正在使用的解決方案。這是'編程',因爲該元素是在運行時創建的,而且是指現有的樣式。 我創建了本教程,因爲我發現這些示例對於初學者來說非常困難,而且我看到一些人對線程有相同的評論。 –