如何访问库项目中自定义 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>
这样您就可以分别利用 MapView
和 FrameLayout
的所有可能性。不要忘记在 fragment/activity 中处理 MapView
的生命周期更改,因为它被告知 here。
您可能还注意到我用 FrameLayout
包装了 ScrollView
并给了这个包装器布局 wight 和 height,而 ScrollView
有 match_parent
。我这样做是因为 ScrollView
具有定义的高度和宽度可能是一个真正的痛苦并且很容易出错,因此建议将其包装在其他布局中用于此类目的的解决方法。
虽然这不是您问题的确切解决方案,但我希望这个答案能以某种方式帮助您。
我正在扩展本身扩展 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>
这样您就可以分别利用 MapView
和 FrameLayout
的所有可能性。不要忘记在 fragment/activity 中处理 MapView
的生命周期更改,因为它被告知 here。
您可能还注意到我用 FrameLayout
包装了 ScrollView
并给了这个包装器布局 wight 和 height,而 ScrollView
有 match_parent
。我这样做是因为 ScrollView
具有定义的高度和宽度可能是一个真正的痛苦并且很容易出错,因此建议将其包装在其他布局中用于此类目的的解决方法。
虽然这不是您问题的确切解决方案,但我希望这个答案能以某种方式帮助您。