我(尽管我刚刚开始)对 Fragments 的理解是它们有点类似于WPF中的用户控件——而且由于我打算重用某些GUI元素,将它们放入活动中似乎会导致大量重复代码。
因此,基于文档中的片段示例,我尝试自己制作。
public class MyFragment: Fragment
{
public override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
}
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
if (container == null)
{
Log.Debug("SmartApp", "Dialer Fragment is in a view without container");
return null;
}
input = container.FindViewById<EditText>(Resource.Id.editText1);
//do some stuff like assigning event handlers, etc.
return base.OnCreateView(inflater, container, savedInstanceState);
}
}
以及应该托管此片段的活动:
[Activity(Label = "My Activity")]
public class TestActivity: Activity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.my_layout);
}
}
最后是这个活动的布局定义
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<fragment class="MonoDevelopTest.MyFragment"
android:id="@+id/titles_fragment"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout>
当我调试这个时,我得到了一个InflateException
(MyActivity.OnCreate
在线SetContentView
)。所以,我做的不对 - 为活动加载所需的布局并将我的片段托管在其中的正确方法是什么?
@edit:啊——因为它经常发生,写下问题会给你一些新的想法。我不是很远 - 我的错误是。我所要做的就是将其添加为第一行MyFragment.OnCreateView:
View fragment = inflater.Inflate(Resource.Layout.dialer, null);
然后我不得不在片段上搜索我的控件,而不是容器(它仍然为空)。
我唯一不太明白的是为什么他们在Xamarincontainer == null
样本中检查DetailsFragment.OnCreateView
(这就是我最初走错路的原因)。