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>
これをデバッグすると、InflateException
in MyActivity.OnCreate
(on the SetContentView
line) が表示されます。だから、私は正しいことをしていません-アクティビティのために希望のレイアウトをロードし、その中でフラグメントをホストする適切な方法は何ですか?
@edit: ああ、よくあることですが、問題を書き留めておくと、いくつかの新しいアイデアが得られます。私はそれほど遠くありませんでした-私のエラーはそうでした. 私が変更しなければならなかったのは、これを最初の行として追加することだけでしたMyFragment.OnCreateView:
View fragment = inflater.Inflate(Resource.Layout.dialer, null);
そして、コンテナ(nullのまま)ではなく、フラグメントでコントロールを検索する必要がありました。
私がよく理解していない唯一のことは、なぜXamarinサンプルでチェックインするcontainer == null
のDetailsFragment.OnCreateView
かということです (これが、私が最初に間違ったルートをたどった原因です)。