gpt4 book ai didi

android - 顶部带有自定义 View 的 SupportMapFragment

转载 作者:行者123 更新时间:2023-11-29 19:47:52 24 4
gpt4 key购买 nike

我在自定义 SupportMapFragment 布局时遇到了一些问题。我基本上想在 map fragment 布局的底部添加一个自定义 View 。

我设法以编程方式向 fragment 添加 View ,如下所示:

@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_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:visibility="gone"
app:cardBackgroundColor="@color/white"
>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>

... some basic content

</LinearLayout>


</android.support.v7.widget.CardView>

问题是我的自定义 View 没有显示在底部,而是显示在顶部。似乎没有考虑我设置的重力属性。我还尝试使用 RelativeLayout 作为包装器并手动添加规则以在底部对齐自定义 View ,但结果是一样的。

语言:正如@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, wrapper, savedInstanceState);
wrapper.addView(mapView);

customView = inflater.inflate(R.layout.custom_view, wrapper, false);
wrapper.addView(customView);

return wrapper;
}

另一种解决方案是以编程方式创建自定义 View 的参数,如下所示:

@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;
}

最佳答案

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);

您只需将 true 更改为 true 即可直接在 wrapper 内膨胀 CardView。

// 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);

关于android - 顶部带有自定义 View 的 SupportMapFragment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37415131/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com