所以我讀到的人很難通過Java設置view
的樣式。目前還沒有這樣的方法myView.setStyle("styleName")
。在Android上以編程方式創建的樣式視圖
然後,當您通過代碼創建佈局元素(如textvews
和imageviews
或linearlayouts
)作爲容器時,您如何設置它們的樣式?你是否按照每個新創建元素的規則分配規則?還是有更有效的方法來完成這項任務?
@EDIT
好吧,我想通了,它是如何做到的。會回答我的問題與我使用
所以我讀到的人很難通過Java設置view
的樣式。目前還沒有這樣的方法myView.setStyle("styleName")
。在Android上以編程方式創建的樣式視圖
然後,當您通過代碼創建佈局元素(如textvews
和imageviews
或linearlayouts
)作爲容器時,您如何設置它們的樣式?你是否按照每個新創建元素的規則分配規則?還是有更有效的方法來完成這項任務?
@EDIT
好吧,我想通了,它是如何做到的。會回答我的問題與我使用
可以通過指定在Android主題的名稱中使用的主題和風格
一個主題可以被應用到整個應用程序的解決方案清單
例如<application android:theme="@style/CustomTheme">
您可以通過指定特定樣式來覆蓋特定活動的主題。
有各種預定義的主題全息光和全息黑是更常見的主題。大多數應用程序首先創建一個新的主題,該主題從上述主題之一繼承,並根據需要覆蓋特定元素。
要做的最好的事情就是參考文檔,該文檔應始終是您的第一個端口。
你可以繼承你想要的風格的視圖,並通過您希望在運行時應用的樣式。像下面的類一樣,它只是將自定義字體設置爲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;
}
}
以及我如何參考風格?我的意思是,我應該將什麼作爲defStyle傳遞給構造函數?例如,如果我在styles.xml中設置了樣式'myStyle',應該如何在構造函數中使用它? –
您可以使用R.style.myStyle來引用樣式。您需要將XML中的TextView元素替換爲TextView子類的完全限定名稱! –
@NitinSethi不,你不能。看看https://code.google.com/p/android/issues/detail?id=12683#c15 –
每個視圖或其子類都有一個採用Style參數的第三個構造方法。例如,View的構造函數爲this。提及這個視圖的樣式資源ID,因此它應該在視圖創建過程中提及。
從技術文檔
默認樣式應用到了這一觀點。如果爲0,則不會應用樣式(超出主題中包含的樣式)。這可能是屬性資源,其值將從當前主題中檢索,或者是顯式樣式資源。
我發現目標是編程方式創建的元素,以前的風格別的地方的解決方案。
首先,我在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);
...
很容易,是不是?我希望可以幫助
...以及這是如何編程? prijupaul的回答是正確的。該問題:您只能在實例化視圖對象/元素時應用樣式,之後您可以逐個更改屬性,但無法應用完整樣式。 –
這就是他的意思:新的TextView(this,null,R.style.firstChild),然後設置合適的LayoutParams,就完成了。 –
他的回答可能是正確的(我希望它可以幫助其他人)。我正在添加我正在使用的解決方案。這是'編程',因爲該元素是在運行時創建的,而且是指現有的樣式。 我創建了本教程,因爲我發現這些示例對於初學者來說非常困難,而且我看到一些人對線程有相同的評論。 –
他的問題是「在Android上以編程方式創建的樣式視圖」,而不是通過XML文件。 – prijupaul
@prijupaul在代碼中創建的小部件選取應用於清單中應用程序聲明的主題。樣式可以在代碼和XML中應用,主題和樣式應該創建爲XML文檔。那麼你有什麼意見? – jamesc