문제

I am porting a native Android app to Xamarin + MVVMCross. On my Native Android app I was easily able to create my custom DateDisplayPicker and use it. I'm having trouble in Xamarin. My control lives here:

here

My DateDisplayPicker.cs looks like so:

namespace XxxxXxxx.Droid.CustomViews
{
    public class DateDisplayPicker : TextView, DatePickerDialog.IOnDateSetListener
    {
        private readonly Context context;
        private readonly Calendar calendar;

        protected DateDisplayPicker(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)
    {
    }

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

    public DateDisplayPicker(Context context, IAttributeSet attrs) : base(context, attrs)
    {
        this.context = context;
        SetAttributes();
        this.calendar = Calendar.Instance;
    }

    public DateDisplayPicker(Context context, IAttributeSet attrs, int defStyle) : base(context, attrs, defStyle)
        {
            this.context = context;
            calendar = Calendar.Instance;
        }

        private void SetAttributes()
        {
            Click += (sender, args) => ShowDateDialog();
        }

        private void ShowDateDialog()
        {
            var c = Calendar.Instance;
            var dp = new DatePickerDialog(context, this, c.Get(CalendarField.Year),
                c.Get(CalendarField.Month), c.Get(CalendarField.DayOfMonth));
            dp.Show();
        }

        public void OnDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth)
        {
            Text = String.Format("%s/%s/%s", monthOfYear + 1, dayOfMonth, year);
            calendar.Set(year, monthOfYear, dayOfMonth);
        }

        public void AddDay()
        {
            calendar.Add(CalendarField.Date, 1);
            Text = String.Format("%s/%s/%s", calendar.Get(CalendarField.Month) + 1,
                calendar.Get(CalendarField.DayOfMonth), calendar.Get(CalendarField.Year));
        }

        public void SubtractDay()
        {
            calendar.Add(CalendarField.Date, -1);
            Text = String.Format("%s/%s/%s", calendar.Get(CalendarField.Month) + 1,
                calendar.Get(CalendarField.DayOfMonth), calendar.Get(CalendarField.Year));
        }

        public string GetDate()
        {
            var sdf = new SimpleDateFormat("yyyyMMdd");
            return sdf.Format(calendar.Time);
        }
    }
}

And them I'm accessing it in my Android fragment like so:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:orientation="vertical">
        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true">
            <com.workspace.xxxxxxxx.droid.customviews.DateDisplayPicker
                android:id="@+id/managerDate"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textAlignment="center"
                android:layout_centerHorizontal="true"
                android:text="XX-XX-XXXX"
                android:textSize="16sp"
                android:textColor="@android:color/holo_blue_dark"
                style="@android:style/Widget.Holo.Spinner"
                android:hint="Date" />
            <ImageButton
                android:id="@+id/managerDateMinusButton"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_toLeftOf="@id/managerDate"
                android:layout_marginRight="@dimen/button_padding"
                android:src="@drawable/minus"
                android:background="@android:color/transparent" />
            <ImageButton
                android:id="@+id/managerDatePlusButton"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_toRightOf="@id/managerDate"
                android:layout_marginLeft="@dimen/button_padding"
                android:src="@drawable/plus"
                android:background="@android:color/transparent" />
        </RelativeLayout>
        <ExpandableListView
            android:id="@+id/managerExpandableListView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:drawSelectorOnTop="true"
            android:stackFromBottom="false"
            android:layout_marginLeft="15dp"
            android:layout_marginRight="15dp"
            android:layout_marginBottom="15dp" />
    </LinearLayout>
    <ProgressBar
        android:id="@+id/progressBar1"
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:visibility="invisible" />
    <TextView
        android:id="@+id/assignedMessageText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:gravity="center"
        android:text="No tasks today."
        android:visibility="visible"
        android:layout_below="@id/progressBar1" />
</RelativeLayout>

From the few examples I've seen this is pretty much how they've been set up but I must be missing something. Any ideas? I've confirmed my namespace for the control in the axml is all lowercase. When my application errors out I get:

Pending exception is:
android.view.InflateException: Binary XML file line #1: Error inflating class com.workspace.xxxxxxxx.droid.customviews.DateDisplayPicker
(raw stack trace not found)
Caused by:
java.lang.ClassNotFoundException: Didn't find class "com.workspace.xxxxxxxx.droid.customviews.DateDisplayPicker" on path: DexPathList[[zip file "/data/app/com.workspace.xxxxxxxx-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.workspace.xxxxxxxx-1, /vendor/lib, /system/lib]]
도움이 되었습니까?

해결책

Never mind I was just being dumb. If I leave off the "com." this works so it seems like the lesson learned here is to use EXACTLY what the namespace is on the control class, in this case it was "xxxxxxxx.droid.customviews.DateDisplayPicker" in the axml. Hope this helps anyone else who strugged with this!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top