如何访问库项目中自定义 FrameLayout 的子元素?

How to access sub elements of a custom FrameLayout in a library project?

我正在扩展本身扩展 FrameLayout 的 "MapView"。但是我无法访问我添加的 ui 元素: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;

但是在尝试获取 LinearLayout

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

我试过添加

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

(调用后我尝试访问我的 ui 元素)

在不同的地方(例如构造函数)调用以下内容

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

我没有多个同名的布局文件。

我不能使用 setContentView(...) 因为这是一个视图而不是 Activity?

官方文档 MapView here 明确表示

Note: You are advised not to add children to this view.

这意味着 MapView 自定义内部视图仅部分支持或完全不支持。我不建议您使用支持不佳的东西,因为它可能会像您所拥有的那样产生奇怪的错误。特别是在 MapView 中,它具有复杂的触摸监听器和广泛的内部 UI - 你可以轻松地破坏某些东西(例如使用 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>

这样您就可以分别利用 MapViewFrameLayout 的所有可能性。不要忘记在 fragment/activity 中处理 MapView 的生命周期更改,因为它被告知 here

您可能还注意到我用 FrameLayout 包装了 ScrollView 并给了这个包装器布局 wight 和 height,而 ScrollViewmatch_parent。我这样做是因为 ScrollView 具有定义的高度和宽度可能是一个真正的痛苦并且很容易出错,因此建议将其包装在其他布局中用于此类目的的解决方法。

虽然这不是您问题的确切解决方案,但我希望这个答案能以某种方式帮助您。