0

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; 
} 
+0

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. –

+0

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. –

+1

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()" –

Antwort

1

Die inflater Zeile von Code inflater.inflate(R.layout.custom_view, container, false); die container es soll LayoutParams angeben, die aus dem XML in das übergeordnete Layout verwendet werden sollen. Aber dann haben Sie ein LinearLayout.LayoutParams instanziiert. Und dann fügten Sie es einem FrameLayout hinzu. Also wurde alles verworfen, weil es nicht zusammenpasst.

Im moment gibt es ein paar einfache Möglichkeiten, es zu beheben:

Sie können die CardView mit dem richtigen Eltern Layout aufblasen:

// add this line AFTER you created the FrameLayout 
View customView = inflater.inflate(R.layout.custom_view, wrapper, false); 

Sie können die CardView direkt im wrapper aufblasen, indem einfach zu 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); 

Sie können Ihre params als die richtige Art erstellen:

// use FrameLayout.LayoutParams when using FrameLayout as the parent. 
FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) customView.getLayoutParams(); 
params.gravity = Gravity.BOTTOM; 
customView.setLayoutParams(params); 
+0

Sie haben Recht, ich habe den ViewGroup-Root-Parameter der Inflation-Methode verpasst. Ich habe das LinearLayout verwendet, weil die FrameLayout-Parameter mir eine Klassenausnahme-Ausnahme gegeben haben (aber jetzt macht es Sinn, weil ich die falschen Layoutparameter dafür verwendet habe). Probieren Sie es jetzt aus. –

+0

Ich habe Ihre Antwort als die richtige markiert. Vielen Dank für die Hilfe. –

+0

Ich bin froh, dass ich helfen konnte. PS. Nur für die Korrektheit mit den LayoutParams, sollten Sie wahrscheinlich 'super.onCreateView' aufrufen und den 'wrapper' übergeben. So: 'Zeige mapView = super.onCreateView (inflater, wrapper, savedInstanceState);' – Budius

Verwandte Themen