Theme and Style customization
suggest changeMainActivity.java:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:custom="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" tools:context=".MainActivity"> <com.customthemeattributedemo.customview.CustomTextView style="?mediumTextStyle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="20dp" android:text="@string/message_hello" custom:font_family="@string/bold_font" /> <com.customthemeattributedemo.customview.CustomTextView style="?largeTextStyle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="20dp" android:text="@string/message_hello" custom:font_family="@string/bold_font" /> </LinearLayout>
CustomTextView.java:
public class CustomTextView extends TextView { private static final String TAG = "TextViewPlus"; private Context mContext; public CustomTextView(Context context) { super(context); mContext = context; } public CustomTextView(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; setCustomFont(context, attrs); } public CustomTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mContext = context; setCustomFont(context, attrs); } private void setCustomFont(Context ctx, AttributeSet attrs) { TypedArray customFontNameTypedArray = ctx.obtainStyledAttributes(attrs, R.styleable.CustomTextView); String customFont = customFontNameTypedArray.getString(R.styleable.CustomTextView_font_family); Typeface typeface = null; typeface = Typeface.createFromAsset(ctx.getAssets(), customFont); setTypeface(typeface); customFontNameTypedArray.recycle(); } }
attrs.xml:
<?xml version="1.0" encoding="utf-8"?> <resources> <attr name="mediumTextStyle" format="reference" /> <attr name="largeTextStyle" format="reference" /> <declare-styleable name="CustomTextView"> <attr name="font_family" format="string" /> <!--- Your other attributes --> </declare-styleable> </resources>
strings.xml:
<resources> <string name="app_name">Custom Style Theme Attribute Demo</string> <string name="message_hello">Hello Hiren!</string> <string name="bold_font">bold.ttf</string> </resources>
styles.xml:
<resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <item name="mediumTextStyle">@style/textMedium</item> <item name="largeTextStyle">@style/textLarge</item> </style> <style name="textMedium" parent="textParentStyle"> <item name="android:textAppearance">@android:style/TextAppearance.Medium</item> </style> <style name="textLarge" parent="textParentStyle"> <item name="android:textAppearance">@android:style/TextAppearance.Large</item> </style> <style name="textParentStyle"> <item name="android:textColor">@android:color/white</item> <item name="android:background">@color/colorPrimary</item> <item name="android:padding">5dp</item> </style> </resources>
Found a mistake? Have a question or improvement idea?
Let me know.
Table Of Contents