Xamarin.android 为Xamarin Android创建自定义控制器时出现问题
我正在将一个本地Android应用程序移植到Xamarin+MVVMCross。在我的原生Android应用程序上,我可以轻松创建并使用我的自定义DateDisplayPicker。我在Xamarin遇到麻烦了。我的控制权在这里: 我的DateDisplayPicker.cs看起来是这样的:Xamarin.android 为Xamarin Android创建自定义控制器时出现问题,xamarin.android,xamarin,mvvmcross,Xamarin.android,Xamarin,Mvvmcross,我正在将一个本地Android应用程序移植到Xamarin+MVVMCross。在我的原生Android应用程序上,我可以轻松创建并使用我的自定义DateDisplayPicker。我在Xamarin遇到麻烦了。我的控制权在这里: 我的DateDisplayPicker.cs看起来是这样的: namespace XxxxXxxx.Droid.CustomViews { public class DateDisplayPicker : TextView, DatePickerDialog
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>
没关系,我只是在装傻。如果我不使用“com”,这是有效的,因此这里的经验教训似乎是使用确切地控制类上的名称空间,在本例中,它是axml中的“xxxxxxxx.droid.customviews.DateDisplayPicker”。希望这有助于其他人谁与此纠缠
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]]