来自引用项目的 CustomComponent FindViewById returns null
CustomComponent FindViewById from referenced project returns null
在 C# Xamarin Android 项目中,我试图创建一个自定义复合组件 select 一个月。这扩展了 LinearLayout
.
我希望重新使用它(并使我的主项目更整洁),所以我有 2 个项目 - 我的 main/parent 项目,包含我的 Activity 和多个片段;以及我的组件的一个简单 Android 项目。
当我 运行 组件项目直接使用它自己的 Activity 时,它按预期工作,但是当我从我的主项目中引用它时,我的 FindViewById
return null
.
我可以看到 this
和 context
来自主项目 - 我想了解我做错了什么或者我需要添加什么以便它找到组件的要膨胀的布局和控件?
主视图(Ui.DateScrollPicker.Droid
是我的组件的命名空间,ScrollMonthPicker
我的 class):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="10dp"
android:paddingRight="10dp">
.......
<ui.datescrollpicker.droid.ScrollMonthPicker
android:id="@+id/my_scroll_month_picker"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
引用自 override View OnCreateView
方法中的 Android.Support.V4.App.Fragment
:
scrollMonthPicker = view.FindViewById<ScrollMonthPicker>(Resource.Id.scroll_month_picker);
scrollMonthPicker.DateChanged += DatePicker_Changed;
通过扩展 LinearLayout
,我实现了 2 个构造函数,包括 ScrollMonthPicker(Context context, IAttributeSet attrs) : base(context, attrs, 0)
,它被调用并开始膨胀我的组件的布局。
组件视图(scroll_month_layout.axml):
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<TextView
android:id="@+id/month_current_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Month" />
<TextView
android:id="@+id/year_current_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Year" />
<android.support.v7.widget.RecyclerView
android:id="@+id/month_recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</merge>
ScrollMonthPicker 构造函数:
public ScrollMonthPicker(Context context, IAttributeSet attrs)
: base(context, attrs, 0)
{
InflateLayout(context, attrs);
}
ScrollMonthPicker 展开视图:
private void InflateLayout(Context context, IAttributeSet attrs)
{
var inflater = LayoutInflater.FromContext(this.Context);
inflater.Inflate(Resource.Layout.scroll_month_layout, this);
monthCurrentText = FindViewById<TextView>(Resource.Id.month_current_text);
yearCurrentText = FindViewById<TextView>(Resource.Id.year_current_text);
monthRecyclerView = FindViewById<RecyclerView>(Resource.Id.month_recycler_view);
monthRecyclerView.HasFixedSize = true;
......
}
从 'its own' Activity 调用该组件时工作正常,但所有 FindViewById
均为空(monthCurrentText
、yearCurrentText
和 monthRecyclerView
) 当被主项目中的片段引用时。
如果我等待 monthRecyclerView.HasFixedSize
的主片段中抛出异常,我不会得到空引用异常,但是这个:
Unhandled Exception:
System.NotSupportedException: Could not activate JNI Handle 0x7fff30d40b00 (key_handle 0x8f4c53e) of Java type 'md53fd9f663a5e8ddcd0a5da1b57d05fd99/ScrollMonthPicker' as managed type 'Ui.DateScrollPicker.Droid.ScrollMonthPicker'.
如何通过从单独的项目中引用使其按预期填充?
非常感谢。
看来你的两个项目都是android项目。您不能在一个项目中使用另一个 android 项目代码。我认为您需要将 CustomComponent 项目创建为一个库。
在 C# Xamarin Android 项目中,我试图创建一个自定义复合组件 select 一个月。这扩展了 LinearLayout
.
我希望重新使用它(并使我的主项目更整洁),所以我有 2 个项目 - 我的 main/parent 项目,包含我的 Activity 和多个片段;以及我的组件的一个简单 Android 项目。
当我 运行 组件项目直接使用它自己的 Activity 时,它按预期工作,但是当我从我的主项目中引用它时,我的 FindViewById
return null
.
我可以看到 this
和 context
来自主项目 - 我想了解我做错了什么或者我需要添加什么以便它找到组件的要膨胀的布局和控件?
主视图(Ui.DateScrollPicker.Droid
是我的组件的命名空间,ScrollMonthPicker
我的 class):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="10dp"
android:paddingRight="10dp">
.......
<ui.datescrollpicker.droid.ScrollMonthPicker
android:id="@+id/my_scroll_month_picker"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
引用自 override View OnCreateView
方法中的 Android.Support.V4.App.Fragment
:
scrollMonthPicker = view.FindViewById<ScrollMonthPicker>(Resource.Id.scroll_month_picker);
scrollMonthPicker.DateChanged += DatePicker_Changed;
通过扩展 LinearLayout
,我实现了 2 个构造函数,包括 ScrollMonthPicker(Context context, IAttributeSet attrs) : base(context, attrs, 0)
,它被调用并开始膨胀我的组件的布局。
组件视图(scroll_month_layout.axml):
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<TextView
android:id="@+id/month_current_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Month" />
<TextView
android:id="@+id/year_current_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Year" />
<android.support.v7.widget.RecyclerView
android:id="@+id/month_recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</merge>
ScrollMonthPicker 构造函数:
public ScrollMonthPicker(Context context, IAttributeSet attrs)
: base(context, attrs, 0)
{
InflateLayout(context, attrs);
}
ScrollMonthPicker 展开视图:
private void InflateLayout(Context context, IAttributeSet attrs)
{
var inflater = LayoutInflater.FromContext(this.Context);
inflater.Inflate(Resource.Layout.scroll_month_layout, this);
monthCurrentText = FindViewById<TextView>(Resource.Id.month_current_text);
yearCurrentText = FindViewById<TextView>(Resource.Id.year_current_text);
monthRecyclerView = FindViewById<RecyclerView>(Resource.Id.month_recycler_view);
monthRecyclerView.HasFixedSize = true;
......
}
从 'its own' Activity 调用该组件时工作正常,但所有 FindViewById
均为空(monthCurrentText
、yearCurrentText
和 monthRecyclerView
) 当被主项目中的片段引用时。
如果我等待 monthRecyclerView.HasFixedSize
的主片段中抛出异常,我不会得到空引用异常,但是这个:
Unhandled Exception:
System.NotSupportedException: Could not activate JNI Handle 0x7fff30d40b00 (key_handle 0x8f4c53e) of Java type 'md53fd9f663a5e8ddcd0a5da1b57d05fd99/ScrollMonthPicker' as managed type 'Ui.DateScrollPicker.Droid.ScrollMonthPicker'.
如何通过从单独的项目中引用使其按预期填充?
非常感谢。
看来你的两个项目都是android项目。您不能在一个项目中使用另一个 android 项目代码。我认为您需要将 CustomComponent 项目创建为一个库。