Ich habe einige Probleme mit der Anpassung von SupportMapFragment Layout. Ich möchte im Grunde eine benutzerdefinierte Ansicht am unteren Rand des Kartenfragmentlayouts hinzufügen.SupportMapFragment mit der benutzerdefinierten Ansicht oben
ich es geschafft, eine Ansicht programmatisch an das Fragment wie folgt hinzuzufügen:
@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;
}
Die custom_view Layout ist ein einfaches CardView ohne komplizierte Logik:
<?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>
Das Problem ist, dass mein Die benutzerdefinierte Ansicht wird nicht unten, sondern oben angezeigt. Es scheint, dass die von mir eingestellten Gravitationseigenschaften nicht berücksichtigt werden. Ich habe auch versucht, ein RelativeLayout als Wrapper zu verwenden und manuell die Regel hinzuzufügen, um die benutzerdefinierte Ansicht am unteren Rand auszurichten, aber das Ergebnis war das gleiche.
LE: Wie @Budius in seiner Antwort erwähnt, übersah ich die ViewGorup Wurzel Parameter der inflate() Methode.
Dies ist die korrekte Umsetzung der Parameter in der Layout-Set zu verwenden:
@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;
}
Eine andere Lösung dafür ist, die Parameter des benutzerdefinierten Ansicht programmatisch wie diese, zu erstellen:
@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;
}
Warum gehst du nicht einfach, sie in 'LinearLayout' in der XML-Datei setzen? So habe ich gemacht, was du beschrieben hast. Sie können Include für ein benutzerdefiniertes XML-Layout verwenden. –
Ich habe kein benutzerdefiniertes Layout für das Kartenfragment festgelegt, wie Sie an der Implementierung sehen können! Meine Map-Fragment-Klasse erweitert direkt das SupportMapFragment, ich möchte nicht all diese Logik für eine einfache Ansicht berühren, deshalb habe ich beschlossen, die onCreateView() -Methode zu überschreiben. –
Versuchen Sie, die Parameter zum 'addView' hinzuzufügen, wie zum Beispiel:' wrapper.addView (customView, params); '. und einige Antworten auf andere Fragen, die Sie möglicherweise die LinearLayout mit "new" anstelle von "getLayoutParams()" –