xamarin中的自定义控件示例?

时间:2019-01-07 20:36:14

标签: c# android xamarin

我创建了一个attrs.xml,我尝试使用[Register(“ First_android.RotatedTextView”)]给我noclassdeffounderror。我试图重建,干净的解决方案,删除这两个obj,bin什么也没有。 有没有人可以公开获得与此类似的自定义控件示例?

[Register("First_android.RotatedTextView")]
public class RotatedTextView : TextView
{

    public RotatedTextView(Android.Content.Context context) : base(context, null, 0)
    {

    }


    public RotatedTextView(Android.Content.Context context, IAttributeSet attrs) : base(context, attrs)
    {

    }

    public RotatedTextView(Android.Content.Context context, IAttributeSet attrs, int defStyle) : base(context, attrs, defStyle)
    {

    }

    public RotatedTextView(Android.Content.Context context, IAttributeSet attrs, int defStyle, int defStyle2) : base(context, attrs, defStyle, defStyle2)
    {

    }
}

我的attrs.xml:

<?xml version="1.0" encoding="utf-8"?>
 <resources>
    <declare-styleable name="First_android.RotatedTextView">
       <attr name="customFont" format="string"/>
    </declare-styleable>
 </resources>

Main.axml:

<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:my="http://schemas.android.com/apk/res-auto"
xmlns:alias="http://schemas.android.com/apk/res/First_android"
android:orientation="vertical"
android:rowCount="4"
android:columnCount="2"
android:layout_width="match_parent"
android:layout_height="match_parent">
<First_android.RotatedTextView
    android:text="Placeholder 101" />

更新: AndroidJunior example not working for me

2 个答案:

答案 0 :(得分:1)

诀窍是,您必须使用名称空间的小写字母。仅保留班级名称字母大小写。

解决方案:

  • 删除Register属性
  • 使用<my.coolnamespace.RotatedTextView...></my.coolnamespace.RotatedTextView>

示例

namespace My.CoolNamespace
{
    public class RotatedTextView : TextView
    {

        public RotatedTextView(Android.Content.Context context) : base(context, null, 0)
        { }

        public RotatedTextView(Android.Content.Context context, IAttributeSet attrs) : base(context, attrs)
        { }

        public RotatedTextView(Android.Content.Context context, IAttributeSet attrs, int defStyle) : base(context, attrs, defStyle)
        { }

        public RotatedTextView(Android.Content.Context context, IAttributeSet attrs, int defStyle, int defStyle2) : base(context, attrs, defStyle, defStyle2)
        { }
    }
}
<my.coolnamespace.RotatedTextView android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true" />

答案 1 :(得分:1)

仅定义attrs.xml是不够的,还需要解析RotatedTextView中的自定义属性。

您可以这样做:

attrs.xml

<?xml version="1.0" encoding="utf-8" ?>
<resources>
  <declare-styleable name="RotatedTextView">
    <attr name="customText" format="string"/>
  </declare-styleable>
</resources>

Main.axml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:showIn="@layout/activity_main">

    <AndroidJunior.RotatedTextView
        android:id="@+id/textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:customText="Test Message"
    />

</RelativeLayout>

RotatedTextView.cs

namespace AndroidJunior
{
    public class RotatedTextView : View
    {
        //private int mColor = Color.Red;
        private String mText = "I am a Custom TextView sdsdasdasdsa";
        private Paint mPaint = new Paint(PaintFlags.AntiAlias);

        public RotatedTextView(Context context) : base(context)
        { 
        }

        public RotatedTextView(Context context, IAttributeSet attrs) : base(context, attrs,0)
        {
            TypedArray typedArray = context.ObtainStyledAttributes(attrs, Resource.Styleable.RotatedTextView);
            //mColor = typedArray.GetColor(Resource.Styleable.RotatedTextView_customColor, Color.Red);
            if (typedArray.GetText(Resource.Styleable.RotatedTextView_customText) != null)
            {
                mText = typedArray.GetText(Resource.Styleable.RotatedTextView_customText).ToString();
            }
            typedArray.Recycle();
        }

        public RotatedTextView(Context context, IAttributeSet attrs, int defStyleAttr) : base(context, attrs, defStyleAttr)
        {
        }


        protected override void OnDraw(Canvas canvas)
        {
            base.OnDraw(canvas);
            canvas.DrawText(mText, 100, 100, mPaint);
        }
    }
}

添加图像以显示项目的结构。

enter image description here