使用Monodroid中的碎片

时间:2012-07-24 14:28:19

标签: c# android-fragments xamarin.android

我(尽管仍然有限,因为我刚刚开始)对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:Aargh - 正如经常发生的那样,写下问题会给你一些新的想法。我不是很远 - 我的错误是。我必须改变的是将其添加为MyFragment.OnCreateView:

中的第一行
View fragment = inflater.Inflate(Resource.Layout.dialer, null);

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

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

1 个答案:

答案 0 :(得分:0)

所有我必须改变的是在MyFragment.OnCreateView中将其添加为第一行:

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

然后我不得不在片段上搜索我的控件,而不是容器。我仍然不太明白为什么在官方样本中他们在OnCreateView中检查容器为null - 但是现在我只涉及手机,而不是桌子,所以我只有一个布局。