Xamarin:为所有容器的孩子使用字体

时间:2014-10-25 12:33:52

标签: android xamarin xamarin.android

我正在使用此代码将字体应用于我的布局中的所有视图:

var mainLayout = FindViewById<RelativeLayout>(Resource.Id.mainLayout);
for (int i = 0; i < mainLayout.ChildCount - 1; i++)
            {
                if (mainLayout.GetChildAt(i) is TextView)
                {
                    ((TextView)mainLayout.GetChildAt(i)).SetTypeface(tf, TypefaceStyle.Bold);
                }
                else if (mainLayout.GetChildAt(i) is EditText)
                {
                    ((EditText)mainLayout.GetChildAt(i)).SetTypeface(tf, TypefaceStyle.Bold);
                }
                else if (mainLayout.GetChildAt(i) is Button)
                {
                    ((Button)mainLayout.GetChildAt(i)).SetTypeface(tf, TypefaceStyle.Bold);
                }

            }

布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/background_pattern"
                android:id="@+id/mainLayout"
    >
    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="25dp"
        android:contentDescription="@string/content_dexcription_logo"
        android:src="@drawable/ic_launcher" />
    <TextView
        android:id="@+id/title"
        style="@style/AuthTitle" />
    <TextView
        android:id="@+id/subtitle"
        style="@style/AuthTitle.AuthSubtitle" />
    <LinearLayout
        android:id="@+id/editTextLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/subtitle"
        android:layout_marginLeft="@dimen/activity_horizontal_margin"
        android:layout_marginRight="@dimen/activity_horizontal_margin"
        android:layout_marginTop="@dimen/login_vertical_margin"
        android:background="@drawable/login_box_radius"
        android:orientation="vertical"
        android:paddingBottom="@dimen/login_vertical_margin"
        android:paddingLeft="@dimen/login_horizental_padding"
        android:paddingRight="@dimen/login_horizental_padding"
        android:paddingTop="@dimen/login_vertical_margin">
        <EditText
            android:id="@+id/usernameField"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ems="10"
            android:hint="@string/username_hint"
            android:textColorHighlight="@color/light_gray"
            android:textSize="17sp">
            <requestFocus />
        </EditText>
        <EditText
            android:id="@+id/passwordField"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="15dp"
            android:ems="10"
            android:hint="@string/password_hint"
            android:inputType="textPassword"
            android:textColorHighlight="@color/light_gray"
            android:gravity="right"
            android:textSize="17sp" />
        <Button
            android:text="Login"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:id="@+id/btnLogin" />
    </LinearLayout>
</RelativeLayout>

但是,它仅适用于TextView s 有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您需要循环ViewGroups本身的子项。目前你的代码只是忽略它们。

此外,无需检查它的Button或EditText,因为它们都扩展了TextView,因此它足以检查它是否是TextView的一个实例。

这是普通java / android中的一个例子:

递归方法:

public void loopViewGroup(ViewGroup viewGroup) {
    for (int i=0; i<viewGroup.getChildCount(); i++) {
        View child = viewGroup.getChildAt(i);
        if (child instanceof TextView) {
            // Extends TextView (EditText, Button etc.)
            ((TextView) child).setTypeface(tf, TypefaceStyle.Bold);
        } else if (child instanceof ViewGroup) {
            // Is a ViewGroup (layout)
            loopViewGroup((ViewGroup) child);
        }
    }
}

启动这样的方法:

loopViewGroup(findViewById(R.id.mainLayout));