0

Fragments についての私の理解 (まだ始まったばかりなのでまだ制限されています) では、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>

これをデバッグすると、InflateExceptionin MyActivity.OnCreate(on the SetContentViewline) が表示されます。だから、私は正しいことをしていません-アクティビティのために希望のレイアウトをロードし、その中でフラグメントをホストする適切な方法は何ですか?

@edit: ああ、よくあることですが、問題を書き留めておくと、いくつかの新しいアイデアが得られます。私はそれほど遠くありませんでした-私のエラーはそうでした. 私が変更しなければならなかったのは、これを最初の行として追加することだけでしたMyFragment.OnCreateView:

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

そして、コンテナ(nullのまま)ではなく、フラグメントでコントロールを検索する必要がありました。

私がよく理解していない唯一のことは、なぜXamarinサンプルでチェックインするcontainer == nullDetailsFragment.OnCreateViewかということです (これが、私が最初に間違ったルートをたどった原因です)。

4

1 に答える 1

0

私が変更しなければならなかったのは、これを MyFragment.OnCreateView の最初の行として追加することだけでした:

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

そして、コンテナではなく、フラグメントでコントロールを検索する必要がありました。公式のサンプルで OnCreateView の null のチェック コンテナーが含まれている理由はまだよくわかりませんが、今のところ、テーブルではなく電話に手を出しているだけなので、レイアウトは 1 つしかありません。

于 2012-07-25T09:01:00.513 に答える