使用C#(不是Xml)在Xamarin Android中的MapView顶部添加ListView

问题描述 投票:0回答:2

我想做的是为附件的图像编写Xamarin Android代码(哪个是Xamarin iOS

我们在所附的Image中可以看到,我们有一个UITableView,其地板编号为(1、2和3)。

如何使用C#(Not XML)在Android中添加ListView以获得相同的结果?

以下是我正在使用的代码的代码段。

但是问题是我的ListView总是在SearchBox下,这不是我想要的。我希望ListView位于屏幕底部。

        private void CreateLayout()
    {
        // Create a new vertical layout for the app
        var layout = new LinearLayout(this) { Orientation = Orientation.Vertical };

        // Search Bar
        _mySearchBox = new AutoCompleteTextView(this) { Hint = "Search rooms or people..." };
        layout.AddView(_mySearchBox);

        //Auto Complete Drop Down List View
        _searchListView = new ListView(this);
        layout.AddView(_searchListView);

        // Progress bar
        _myProgressBar = new ProgressBar(this) { Indeterminate = true, Visibility = ViewStates.Gone };
        layout.AddView(_myProgressBar);

        // Floors List View
        _floorsTableView = new ListView(this);
        _floorsTableView.LayoutParameters = new ViewGroup.LayoutParams(100, 150);
        _floorsTableView.TextAlignment = TextAlignment.Center;
        var adap = new ArrayAdapter(this, Resource.Layout.SimpleSpinnerItem, new List<string>() { "1", "2", "3" });
        _floorsTableView.Adapter = adap;
        _floorsTableView.Visibility = ViewStates.Visible;

        layout.AddView(_floorsTableView);

        // Add a map view to the layout
        _myMapView = new MapView(this);
        layout.AddView(_myMapView);

        // Show the layout in the app
        SetContentView(layout);
    }

enter image description here

c# xamarin xamarin.android
2个回答
0
投票

您应使用RelativeLayout将一个对象放在另一个对象上,然后使用RelativeLayout.LayoutParams指定所需的位置。因此,您需要:

var layout = new RelativeLayout(this);

然后使用LayoutRules.AlignParentBottomLayoutRules.AlignParentLeft

// Floors List View
_floorsTableView = new ListView(this);

// Create parameters for the listview
RelativeLayout.LayoutParams parameters = new RelativeLayout.LayoutParams(100, 150);
parameters.AddRule(LayoutRules.AlignParentBottom);
parameters.AddRule(LayoutRules.AlignParentLeft);

_floorsTableView.TextAlignment = TextAlignment.Center;
var adap = new ArrayAdapter(this, Resource.Layout.SimpleSpinnerItem, new List<string>() { "1", "2", "3" });
_floorsTableView.Adapter = adap;
_floorsTableView.Visibility = ViewStates.Visible;

// Add the listview to the layout with parameters specified
layout.AddView(_floorsTableView, parameters);

我没有测试它,所以您可能必须使用width和height布局参数或类似参数。


0
投票

我建议您切换到RelativeLayout,而不要使用LinearLayout来托管视图。 LinearLayout本质上是要根据其方向来定位内容,而RelativeLayout则为您提供了更大的自由和力量来安排视图。

还请记住,将视图添加到主机容器的顺序很重要。因此,在您的情况下,我将在最后添加ListView。这样,您将确保列表位于其他任何内容之上。

此外,您还需要为每个视图完全指定LayoutParams!

var root = new RelativeLayout(this);

_mySearchBox = new AutoCompleteTextView(this) { Hint = "Search rooms or people..." };

_myMapView = new MapView(this)
{
    Id = View.GenerateViewId()
};

_floorsTableView = new ListView(this)
{
    Id = View.GenerateViewId()
};

var searchBoxParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.WrapContent);
searchBoxParams.AddRule(LayoutRules.AlignParentTop);

var mapParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.MatchParent);

var listParams = new RelativeLayout.LayoutParams(100, 150);
listParams.AddRule(LayoutRules.AlignParentStart);
listParams.AddRule(LayoutRules.AlignParentBottom);
listParams.SetMargins(16, 0, 0, 16);

root.AddView(_myMapView, mapParams);
root.AddView(_mySearchBox, searchBoxParams);
root.AddView(_floorsTableView, listParams);

SetContentView(root, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.MatchParent));

您还希望将尺寸从px转换为dp

private int DpToPx(int dp)
{
    return (int)TypedValue.ApplyDimension(ComplexUnitType.Dip, dp, Resources.DisplayMetrics);
}

这样,您的尺寸将根据显示密度缩放。

© www.soinside.com 2019 - 2024. All rights reserved.