Добавление ListView поверх MapView в Xamarin Android с использованием C # (не Xml) - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь написать код Xamarin Android для прикрепленного изображения (это Xamarin iOS )

Как мы видим на прикрепленном изображении, у нас есть UITableView с номерами этажей (1, 2 и 3).

Как добавить ListView в Android с помощью C # (не XML) чтобы получить тот же результат?

Вот фрагмент кода кода, который я использую.

Но проблема в том, что мой 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

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Я предлагаю вам переключиться на 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);
}

Таким образом, ваши размеры будут масштабироваться в соответствии с плотностью дисплея.

0 голосов
/ 30 октября 2019

Вы должны использовать RelativeLayout, чтобы поместить объект поверх другого объекта, затем используйте RelativeLayout.LayoutParams, чтобы указать, где вы хотите его. Итак, вам нужно:

var layout = new RelativeLayout(this);

А затем с помощью LayoutRules.AlignParentBottom и LayoutRules.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);

Я не проверял это, поэтому вам, возможно, придется поиграть с разметкой по ширине и высоте. параметры или тому подобное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...