SupportMapFragment 顶部有自定义视图
Posted
技术标签:
【中文标题】SupportMapFragment 顶部有自定义视图【英文标题】:SupportMapFragment with custom view on top 【发布时间】:2016-09-21 18:12:56 【问题描述】:我在自定义 SupportMapFragment 布局时遇到了一些问题。我基本上想在地图片段布局的底部添加一个自定义视图。
我设法以编程方式将视图添加到片段中,如下所示:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
View mapView = super.onCreateView(inflater, container, savedInstanceState);
View customView = inflater.inflate(R.layout.custom_view, container, false);
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) customView.getLayoutParams();
params.gravity = Gravity.BOTTOM;
customView.setLayoutParams(params);
FrameLayout wrapper = new FrameLayout(inflater.getContext());
wrapper.addView(mapView);
wrapper.addView(customView);
return wrapper;
custom_view 布局是一个简单的 CardView,没有复杂的逻辑:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/custom_view_root"
android:layout_
android:layout_
android:layout_gravity="bottom"
android:visibility="gone"
app:cardBackgroundColor="@color/white"
>
<LinearLayout
android:layout_
android:layout_
android:orientation="horizontal"
>
... some basic content
</LinearLayout>
</android.support.v7.widget.CardView>
问题是我的自定义视图没有显示在底部,而是显示在顶部。似乎我设置的重力属性没有考虑在内。 我也尝试使用RelativeLayout作为包装器并手动添加规则以在底部对齐自定义视图,但结果是一样的。
乐: 正如@Budius 在他的回答中提到的那样,我忽略了 inflate() 方法的 ViewGorup root 参数。
这是使用布局中设置的参数的正确实现:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
FrameLayout wrapper = new FrameLayout(inflater.getContext());
View mapView = super.onCreateView(inflater, container, savedInstanceState);
wrapper.addView(mapView);
customView = inflater.inflate(R.layout.custom_view, wrapper, false);
wrapper.addView(customView);
return wrapper;
另一个解决方案是以编程方式创建自定义视图的参数,如下所示:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
View mapView = super.onCreateView(inflater, container, savedInstanceState);
customView = inflater.inflate(R.layout.custom_view, container, false);
FrameLayout wrapper = new FrameLayout(inflater.getContext());
wrapper.addView(mapView);
FrameLayout.LayoutParams params =
new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT,
Gravity.BOTTOM);
wrapper.addView(customView, params);
return wrapper;
【问题讨论】:
你为什么不简单地将它们包裹在 xml 中的LinearLayout
中呢?我就是按照你描述的那样做的。您可以将 include 用于自定义 xml 布局。
我没有为地图片段设置自定义布局,正如您从实现中看到的那样!我的地图片段类直接扩展了 SupportMapFragment,我不想为简单视图触及所有逻辑,这就是我选择覆盖 onCreateView() 方法的原因。
尝试将参数添加到addView
,例如:wrapper.addView(customView, params);
。以及对提到的其他问题的一些答案,您可能需要用new
而不是getLayoutParams()
初始化LinearLayout
使用带有布局参数的方法不能解决问题。问题是因为我在膨胀时给出了错误的根,从而创建和设置了错误的父级。 Budius 的答案是这种情况下的正确答案。您的答案仍然部分正确,因为使用新的布局对象也是一种解决方案(尽管它会覆盖 xml 中的参数并且您需要手动设置规则)。我在问题中包含了一个使用新布局参数对象的解决方案。
我发现 Budius 的逻辑是正确的,但我认为它不起作用,因为你当时没有回复他。很高兴这一切都解决了。
【参考方案1】:
inflater 代码行inflater.inflate(R.layout.custom_view, container, false);
container
表示要从 XML 到父布局中使用的 LayoutParams。但随后您实例化了一个 LinearLayout.LayoutParams。然后将它添加到 FrameLayout。所以这一切都被丢弃了,因为它不匹配。
有一些简单的方法可以解决它:
您可以使用正确的父布局为 CardView 充气:
// add this line AFTER you created the FrameLayout
View customView = inflater.inflate(R.layout.custom_view, wrapper, false);
您可以直接在 wrapper
内扩展 CardView,只需更改为 true
。
// this will correctly use the layout params you set on XML and add the inflated views into wrapper
inflater.inflate(R.layout.custom_view, wrapper, true);
您可以将参数创建为正确的类型:
// use FrameLayout.LayoutParams when using FrameLayout as the parent.
FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) customView.getLayoutParams();
params.gravity = Gravity.BOTTOM;
customView.setLayoutParams(params);
【讨论】:
你说得对,我错过了 inflate 方法的 ViewGroup 根参数。我使用了 LinearLayout,因为 FrameLayout 参数给了我一个类转换异常(但现在它是有道理的,因为我使用了错误的布局参数)。现在试试看。 我已将您的答案标记为正确答案。谢谢大家的帮助。 很高兴能帮上忙。 PS。只是为了正确使用 LayoutParams,您可能应该调用super.onCreateView
传递 wrapper
。像这样:View mapView = super.onCreateView(inflater, wrapper, savedInstanceState);
以上是关于SupportMapFragment 顶部有自定义视图的主要内容,如果未能解决你的问题,请参考以下文章
向 UITableViewController 添加顶部/底部视图?
SupportMapFragment 不支持 AndroidX Fragment