Избежание исключения NullReferenceException при создании настраиваемого элемента пользовательского интерфейса Android из вложенного TextView - PullRequest
1 голос
/ 14 декабря 2011

Несколько новинок - первое приложение для Android и впервые использующий MonoDroid (у меня большой опыт работы с C # .NET).

В своем пользовательском интерфейсе я хочу нарисовать границу вокруг TextView и нашел сообщение в SO ( 2026873 ), в котором рекомендуется создать подкласс TextView.Я также нашел другой пост ( 2695646 ) с некоторой дополнительной информацией об объявлении пользовательского элемента пользовательского интерфейса Android с использованием XML.(Примечание: весь код в примерах постов был на Java, должен был быть переведен в среду C # / MonoDroid.)

Когда я запускаю код в эмуляторе, я получаю System.NullReferenceException: ссылка на объект не установлена ​​вэкземпляр объекта.

Вот мой готовый код Activity1 и код для подклассированного TextView.

namespace MBTA
{
    [Activity(Label = "MBTA", MainLauncher = true, Icon = "@drawable/icon")]
    public class Activity1 : Activity
    {
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            SetContentView(Resource.Layout.Main);
        }
    }

    public class BorderedTextView : TextView
    {
        public BorderedTextView(Context context, IAttributeSet attrs, int defStyle) : base(context, attrs, defStyle) { }
        public BorderedTextView(Context context, IAttributeSet attrs) : base(context, attrs) { }
        public BorderedTextview(Context context) : base(context) { }

        protected override void OnDraw (Android.Graphics.Canvas canvas)
        {
            base.OnDraw (canvas);

            Rect rect = new Rect();
            Paint paint = new Paint();

            paint.SetStyle(Android.Graphics.Paint.Style.Stoke);
            paint.Color = Android.Graphics.Color.White;
            paint.StrokeWidth = 3;

            GetLocalVisibleRect(rect);
            canvas.DrawRect(rect, paint);
        }
    }
}

Мой макет Main.axml выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res/MBTA"     
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1">
        <MBTA.BorderedTextView
            android:text="DATE"
            android:textSize="15pt"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal|center_vertical"
            android:layout_weight="1"/>
    </LinearLayout>
</LinearLayout>

И мой файл attrs.xml выглядит следующим образом (его BuildAction установлен на AndroidResource):

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="BorderedTextView">
        <attr name="android:text"/>
    <attr name="android:textSize"/>
    <attr name="android:layout_width"/>
    <attr name="android:layout_height"/>
    <attr name="android:gravity"/>
    <attr name="android:layout_weight"/>
    </declare-styleable>
</resources>

Заранее спасибо.

1 Ответ

2 голосов
/ 15 декабря 2011

Mono для Android строчные буквы имени пространства имен при создании Java Android Callable Wrappers для использования в Android и макет XML-файлов.

Следовательно (как отмечено в в предыдущем ответе ), вам нужно использовать mbta.BorderedTextView, а не MBTA.BorderedTextView.

Документация Mono для Android обсуждает с использованием пользовательских представлений в макете , который обращается к этому сценарию.

...