Xamarin を使用してクロスプラットフォーム コントロールを開発しています。私の目標は、選択可能なアイテムのリストを持つことです。正常に動作する iOS コードがいくつかあります。
private UIView CreateViewWithTemplate(UIPickerView pickerView, nint row)
{
// create our content presenter
DYMOContentPresenter presenter = new DYMOContentPresenter();
// set its data template to the one from our control
presenter.ItemTemplate = this._pickerControl.ItemTemplate;
// set the data to the correct item from the list
presenter.ObjectContent = this._pickerControl.Items.ElementAt((int)row);
// and use the xamarin forms renderer factory to get a renderer for the item
IVisualElementRenderer renderer = RendererFactory.GetRenderer(presenter);
// tell the renderer the size of the view and
renderer.SetElementSize(new Size(pickerView.Frame.Width, ROW_HEIGHT));
// then get the native view and return
return renderer.NativeView;
}
ただし、これを Android に実装しようとしてもうまくいきません。
private View CreateViewWithTemplate(int position, View convertView, ViewGroup parent)
{
// create content presenter
DYMOContentPresenter presenter = new DYMOContentPresenter();
// set its data template to the correct item from the list
presenter.ItemTemplate = this._pickerControl.ItemTemplate;
// set data to correct list item
presenter.ObjectContent = this._pickerControl.Items.ElementAt((int) position);
// use Xamarin forms renderer factory to get a renderer for the item
IVisualElementRenderer renderer = RendererFactory.GetRenderer(presenter);
presenter.Layout(new Xamarin.Forms.Rectangle(0, 0, parent.Width, ROW_HEIGHT));
renderer.UpdateLayout();
renderer.Tracker.UpdateLayout();
renderer.ViewGroup.LayoutParameters = new ViewGroup.LayoutParams(parent.Width, ROW_HEIGHT);
renderer.ViewGroup.Layout(0, 0, parent.Width, ROW_HEIGHT);
renderer.ViewGroup.BuildDrawingCache();
// get native view and return
return renderer.ViewGroup;
}
個々のリスト ビューの行は表示されますが、行内にテキストが表示されません。このコードをコメントアウトして単純な に置き換えるとテキストが表示されるTextView
ので、レンダラーに問題があると思われます。このコードの多くのバリエーションも試しました (指定LayoutParams
、子のサイズ変更など)。何も機能していないようです。