【问题标题】:Problems creating a custom controller for Xamarin Android为 Xamarin Android 创建自定义控制器时出现问题
【发布时间】:2014-06-14 06:06:54
【问题描述】:

我正在将原生 Android 应用程序移植到 Xamarin + MVVMCross。在我的 Native Android 应用程序上,我可以轻松创建自定义 DateDisplayPicker 并使用它。我在 Xamarin 中遇到了麻烦。我的控制住在这里:

我的 DateDisplayPicker.cs 看起来像这样:

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);
        }
    }
}

我正在我的 Android 片段中访问它,如下所示:

<?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>

从我看到的几个例子中,这几乎就是它们的设置方式,但我一定遗漏了一些东西。有任何想法吗?我已经确认我的 axml 中控件的命名空间都是小写的。当我的应用程序出错时,我得到:

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]]

【问题讨论】:

    标签: xamarin.android xamarin mvvmcross


    【解决方案1】:

    没关系,我只是愚蠢。如果我离开“com”。这很有效,所以这里学到的教训似乎是使用 EXACTLY 控件类上的命名空间,在这种情况下,它是 axml 中的“xxxxxxxx.droid.customviews.DateDisplayPicker”。希望这可以帮助其他为此苦苦挣扎的人!

    【讨论】:

      猜你喜欢
      • 2020-05-27
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-28
      • 2013-06-23
      相关资源
      最近更新 更多