Как получить доступ к подэлементам пользовательского FrameLayout в проекте библиотеки? - PullRequest
0 голосов
/ 25 сентября 2019

Я расширяю «MapView», который сам расширяет FrameLayout.Но я не могу получить доступ к элементам пользовательского интерфейса, которые я добавил: level_layout и * level_scroll.У меня нет проблем с добавлением кода непосредственно в мой MainActivity, но я не могу заставить его работать в библиотеке.

<?xml version="1.0" encoding="utf-8"?>
<android.company.com.library.mapbox.MyMapView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/mapView">

        <ScrollView
            android:id="@+id/level_scroll"
            android:layout_width="50dp"
            android:layout_height="250dp"
            android:layout_gravity="right"
            android:layout_marginTop="100dp"
            android:orientation="vertical">

            <LinearLayout
                android:id="@+id/level_layout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"></LinearLayout>
        </ScrollView>
</android.company.com.library.mapbox.MyMapView>

В MyMapView.java Я получаю значение от:

int level = R.id.level_layout;

Но linear является нулевым при попытке получить LinearLayout

LinearLayout linear = (LinearLayout) findViewById(R.id.level_layout);

Я пытался добавить

@Override
protected void onFinishInflate() {
    super.onFinishInflate();
}

(я пытаюсь получить доступ к своим элементам пользовательского интерфейса после того, как это вызвано)

Вызов следующего в разных местах (например, конструкторы)

LayoutInflater inflater = (LayoutInflater)this.getContext().getSystemService
        (Context.LAYOUT_INFLATER_SERVICE);
View v = inflater.inflate(R.layout.nameOfTheXmlFile, null);

У меня нет несколькихфайлы макетов с тем же именем.

Я не могу использовать setContentView (...) , так как это View, а не Activity?

1 Ответ

1 голос
/ 29 сентября 2019

Официальная документация для MapView здесь прямо говорит

Примечание. Рекомендуется не добавлять детей в это представление.

Этоозначает, что MapView пользовательские внутренние представления поддерживаются только частично или не поддерживаются вообще.Я бы не рекомендовал вам использовать что-то, что плохо поддерживается, так как это может привести к странным ошибкам, как у вас.Особенно в MapView с его сложным сенсорным слушателем и обширным внутренним пользовательским интерфейсом - вы можете легко что-то сломать (например, увеличение или смахивание камеры с помощью ScrollView)

Честно говоря, я не уверен, почему вы это делаете- Вы можете легко разместить все необходимые представления в обычном FrameLayout, и все будет работать нормально (за исключением, может быть, ScrollView процессор жестов смахивания может нарушить MapView жесты)

Так что было бы разумнее сделать этовот так

<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

        <android.company.com.library.mapbox.MyMapView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/mapView"/>

        <FrameLayout
            android:id="@+id/wrapper_layout"
            android:layout_width="50dp"
            android:layout_height="250dp"
            android:layout_gravity="right"
            android:layout_marginTop="100dp">

            <ScrollView
                android:id="@+id/level_scroll"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical">

                <LinearLayout
                    android:id="@+id/level_layout"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:orientation="vertical">
                </LinearLayout>

            </ScrollView>

        </FrameLayout>

</FrameLayout>

Таким образом, вы сможете использовать все возможности MapView и FrameLayout по отдельности.Не забудьте обработать изменения жизненного цикла для MapView вашего фрагмента / действия, как сказано здесь .

Вы также можете заметить, что я завернул ScrollView с FrameLayoutи дал этому макету обертки вес и высоту, в то время как ScrollView имеет match_parent.Я сделал это, потому что ScrollView с определенной высотой и шириной может быть настоящей болью в заднице и весьма подвержен ошибкам, поэтому для таких целей рекомендуется обернуть его в какой-то другой макет.

Хотя этоне точное решение вашей проблемы, я надеюсь, что этот ответ поможет вам.

...