0

我(尽管我刚刚开始)对 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>

当我调试这个时,我得到了一个InflateExceptionMyActivity.OnCreate在线SetContentView)。所以,我做的不对 - 为活动加载所需的布局并将我的片段托管在其中的正确方法是什么?

@edit:啊——因为它经常发生,写下问题会给你一些新的想法。我不是很远 - 我的错误是。我所要做的就是将其添加为第一行MyFragment.OnCreateView:

View fragment = inflater.Inflate(Resource.Layout.dialer, null);

然后我不得不在片段上搜索我的控件,而不是容器(它仍然为空)。

我唯一不太明白的是为什么他们在Xamarincontainer == null样本中检查DetailsFragment.OnCreateView(这就是我最初走错路的原因)。

4

1 回答 1

0

我所要做的就是将其添加为 MyFragment.OnCreateView 中的第一行:

View fragment = inflater.Inflate(Resource.Layout.dialer, null);

然后我不得不在片段上搜索我的控件,而不是容器。我仍然不太明白为什么在官方示例中他们在 OnCreateView 中检查容器是否为空 - 但现在我只涉足手机,而不是表格,所以我只有一种布局。

于 2012-07-25T09:01:00.513 回答